動態規劃 最長回文子串

2022-07-02 04:03:10 字數 1037 閱讀 1074

最長回文子串的問題描述:

給出乙個字串 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,不...