給定一個字符串 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 && charAt(i)==s.charAt(j) i - j>1;
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);
}