给定一个字符串 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);
}