最長回文子串的問題描述:
給出乙個字串 s,求 s 的最長回文子串的長度例子:
字串 "patzjujztaccbcc" 的最長回文子串為 "atzjujzta",長度為 9還是先看暴力解法,列舉子串的兩個端點 i 和 j,需要判斷在
[i, j]
內的子串是否回文,從複雜度上看,列舉端點需要 o(n2),判斷回文需要 o(n),總複雜度為 o(n3)。
那我們介紹一下動態規劃下時間複雜度為o(n2) 的一種解法。
令dp[i][j]
為 s[i] 到 s[j] 是否為回文子串,是則為 1,否則為 0。這樣根據 s[i] 是否等於 s[j] ,可以把情況分為兩種:
由此寫出狀態轉移方程:
if(s[i] == s[j]) dp[i][j] = dp[i+1][j-1]
if(s[i] != s[j]) dp[i][j] = 0
邊界條件:dp[i][i] = 1, dp[i][i+1] = (s[i] == s[i+1]) ? 1 : 0
注意這個時候可能出現某些狀態始終轉移不到的情況,比如說我們 先固定 i, 然後 j 從 2 開始列舉
而且不論怎麼轉移都轉移不到這個狀態,所以我們必須想出新的列舉方式:
先列舉長度 l (l可以取到字串長度的),再列舉左端點 i,這樣右端點 i + l -1 也能直接得到。
**實現:
#include #include const int maxn = 1010;
char s[maxn];
int dp[maxn][maxn];
int main()
}} // 狀態轉移方程
for(int l = 3; l <= len; l++)
}} printf("%d\n", ans);
return 0;
}
動態規劃 最長回文子串
動態規劃 最長回文子串 題目描述 給出乙個字串s,求s的最長回文子串的長度 樣例 字串 patzjujztaccbcc 的最長回文子串為 atzjujzta 長度為9。動態規劃思想 令dp i j 表示s i 至s j 所表示的子串是否是回文子串,是則為1,不是為0。這樣根據s i 是否等於s j ...
動態規劃 最長回文子串
給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 本題有很多種解法,最簡單的暴力求解,但是會超時。下面分別說明動態規劃法和中心擴散法。解法一 動態規劃法...
最長回文子串 動態規劃
給出乙個字串s,求s的最長回文子串的長度。樣例輸入 patzjujztaccbcc 輸出 9 尋找二維動態規劃表示式dp i j 如果直接用dp i j 表示子符串從s i 到s j 的最長回文子串長度無法得出遞推表示式。令dp i j 表示s i 至s j 所表示的子串是否是回文子串,是則為1,不...