動態規劃之最長回文串

2021-10-02 05:55:09 字數 1264 閱讀 6876

dp[i][j]表示「以s[i]開始s[j]結尾的回文串的長度。如果這個字串不是回文串,讓dp[i][j]=0」。顯然,j>=i,只需往dp填j>=i的部分即可。

dp[i][j]的遞推公式可以這麼表述:

(1)首先對dp的對角線元素初始化為1,也就是當i==j時,dp[i][j]=1。

這很顯然,每個單獨的字元其實就是個長度為1的回文串。

(2)當j-i==1:

若s[i]==s[j],則dp[i][j]=2;否則dp[i][j]=0。

解釋:當j-i==1時,若s[i]==s[j],則s[i]和s[j]可以組成乙個長度為2的回文串。若s[i]!=s[j],顯然他們不可能組成回文串,dp[i][j]=0。

(3)當j-i>=2:

若s[i]==s[j]:若dp[i+1][j-1]>0,則dp[i][j]= dp[i + 1][j - 1] + 2;否則dp[i][j]= 0;

若s[i]!=s[j]:dp[i][j]=0。

解釋:如果s[i]==s[j],表明這個子串有可能是回文串。當去頭去尾後它是回文串時,就可以在去頭去尾的那個回文串長度基礎上+2,得到它的長度。如果去頭去尾後不是回文串,那這個子串一定不是回文串,回文串長度只能是0。

若s[i]!=s[j],顯然他們不可能組成回文串,dp[i][j]=0。

只需找到dp[i][j]的最大元素和它對應的i和j就可以得到結果「s中最長回文子串」。

public class main 

public static string longestpalindrome(string s)

//乙個字元初始化

for (int i = 0; i < len; i++)

//相鄰元素

for (int i = 0; i < len-1; i++) else

}//相隔乙個至少元素

//動態規劃需要注意如何從低向上遍歷,及i,j之間的關係-------參考矩陣連乘

分治

動態規劃之最長回文子串

問題 給出乙個字串s,求s的最長回文子串的長度。樣例 字串 patzjujztaccbcc 的最長回文子串為 atzjujzta 長度為9。還是先看暴力解法 列舉子串的兩個端點i和j,判斷在 i,j 區間內的子串是否回文。從複雜度上來看,列舉端點需要0 n2 判斷回文需要0 n 因此總複雜度是o n...

動態規劃之最長回文子串

問題 給出乙個字串s,求s的最長回文子串的長度。結果 字串 patzjujztaccbcc 的最長回文子串為 atzjujzta 長度為9。暴力解法 列舉子串的兩個端點i和j,判斷在 i,j 區間內的子串是否回文。從複雜度上來看,列舉端點需要0 n2 判斷回文需要0 n 因此總複雜度是o n3 動態...

LeetCode動態規劃之最長回文子串

給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為 1000。輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。輸入 cbbd 輸出 bb 首先,必須要明確最長回文子串的含義,簡單來說就是 從前往後讀和從後往前讀 是一樣的,按照我們動態規劃解題3步驟 定義陣列元素含義,找...