動態規划實現回文字符串問題


問題一:求一個字符串的最大回文字符串長度;

  1)思路:動態規划;

  2)具體描述:設立一個長度len為字符串str,用一個dp[len][len]的二維數組來表示字符串i-j下標所構成的子串的長度,經過循環計算之后我們返回最大回文子串的長度即可,即返回dp[0][len-1];

  3)dp數組的具體實現:根據動態規划自底向上的思想,從回文子串到求出整個最長回文字符串,首先從str的結尾開始遍歷到str 的頭部,同時每一次記錄dp的初始值;如果str[i]==str[j],說明i-j為回文字符串,此時應該更新dp[i][j]的值;如果str[i]≠str[j],應該判斷dp[i+1][j]和dp[i][j-1]的大小,取出其中max作為最大長度更新dp[i][j]的值

  4)代碼實現

 1     static int longestPalindrome1(String str) {
 2         int len = str.length();
 3         for (int i = len - 1; i >= 0; i--) {
 4             dp[i][i] = 1;
 5             for (int j = i+1; j < len; j++) {
 6                 if(str.charAt(i) == str.charAt(j)) {
 7                     dp[i][j] = dp[i + 1][j - 1] +2;
 8                 } else {
 9                     dp[i][j] = Math.max(dp[i+1][j], dp[i][j-1]);
10                 }
11             }
12         }
13         return dp[0][len-1];
14     }

  5)測試結果:測試字符串12ABCBDABADBCBA34的最大回文串,我們可以看出最大回文串為ABCBDABADBCBAB,長度為13

  

問題二:將上述問題修改為輸出最長回文子串

  1)我們知道,動態規划最優解的子問題同樣也是最優解,即最長回文字符串的子串也是回文串,假設p[i][j]是回文字符串,那么p[i+1][j-1]也是回文字符串,這樣最長回文字符串就能夠分解成為一系列子問題來求解。

  2)代碼實現

 1     static String longestPalindrome2(String str) {
 2         int len = str.length();
 3         int maxlen = 0, start = 0;
 4         for (int i = 0; i < str.length(); i++) {
 5             dp[i][i] = 1;
 6             if(i < len -1 && str.charAt(i) == str.charAt(i+1)) {
 7                 dp[i][i+1] = 1;
 8                 start = i;
 9                 maxlen = 2;
10             }
11         }
12         
13         for (int i = 3; i < str.length(); i++) { //分析整個串長度
14             for (int j = 0; j < len - i; j++) { //子串其實地址
15                 int m = i+j - 1; //子串結束地址
16                 if(dp[j+1][i-1] == 1 && str.charAt(i) == str.charAt(j)) {
17                     dp[j][i] = 1;
18                     maxlen = i;
19                     start = j;
20                 }
21             }
22         }
23         return str.substring(start,start+maxlen-1);
24     }

  2)測試輸入:同樣是將上述測試用例,測試字符串12ABCBDABADBCBA34的最大回文串,我們可以看出最大回文串為ABCBDABADBCBAB

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM