思路:
动态规划
代码:
class Solution {
public String longestPalindrome(String s) {
int len=s.length();
if(len<2){
return s;
}
boolean[][] dp=new boolean[len][len];
//初始化
for(int i=0;i<len;i++){
dp[i][i]=true;
}
int maxLen=1;
int begin=0;
for(int j=1;j<len;j++){
for(int i=0;i<j;i++){
if(s.charAt(i)!=s.charAt(j)){
dp[i][j]=false;
}
else{
if(j-i<3){
dp[i][j]=true;
}
else{
dp[i][j]=dp[i+1][j-1];
}
}
if(dp[i][j]&&j-i+1>maxLen){
maxLen=j-i+1;
begin=i;
}
}
}
return s.substring(begin,begin+maxLen);
}
}
分解:
1)初始化:对角线都置为true,因为一个字符也满足条件
2)初始化maxLen时,是1而不是0,因为一个字符也满足条件
3)从左边开始填满,当首尾的字符相同时,如果长度j-i<3:
i)有2个字符并且首尾相同
ii)只有一个字符
都满足条件,都置为true
4)每次dp[i][j]为true时,判断一下是否需要更换前后边界
复杂度分析:
时间复杂度:O(N^2)
空间复杂度:O(N^2)因为dp是二维数组