最長迴文子串DP
阿新 • • 發佈:2018-11-03
給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為1000。
示例 1:
輸入: "babad"
輸出: "bab"
注意: "aba"也是一個有效答案。
示例 2:
輸入: "cbbd"
輸出: "bb"
分析:dp dp[ j ][ i ] 表示從 j 到 i 的子串 ,
若dp[ j ][ i ] 為迴文串,則 dp[ j+1 ][ i-1 ] 必然迴文 ,有如下關係
dp[ j ][ i ] =true when dp[ j+1 ][ i-1 ] =true
dp[ j ][ i ] =true when s.charAt(i)==s.charAt(j) i - j>1 ,即 i = j + 1
dp[ j ][ i ] =true when i=j;
static String ff(String s){ int n=s.length(); boolean[][] dp =new boolean[n][n]; int max_len=1; //儲存最長迴文子串長度 int start=0;//儲存最長迴文子串起點 for(int i=0;i<s.length();++i) { for(int j=0;j<=i;++j) { if(i-j<2) dp[j][i]=(s.charAt(i)==s.charAt(j)); else dp[j][i]=(s.charAt(i)==s.charAt(j)&& dp[j+1][i-1]); if(dp[j][i] && max_len<(i-j+1)) { max_len=i-j+1; start=j; } } } for (boolean[] booleen : dp) { for (boolean b : booleen) { System.out.print(b+"\t"); } System.out.println(); } return s.substring(start,start+max_len); }