题目分析
回文串的特性:
两侧对称相等,允许最中间不满足
思路:动态规划。
d[i]表示字符串s第i个字符为结尾最大回文串,d[i]与d[i-1]有关系,其具体关系为:d[i]<=d[i-1]+1,如果d[i-1]对应的字符串远离d[i]的一侧与s[i]不相同,则只能在d[i-1]字符串内找起始点,如果满足起始点和终点相同,判断是否为回文串。
class Solution {
public String longestPalindrome(String s) {
String[] d = new String[s.length()+1];
d[0] = "";
int maxLen = 0;
for(int i = 1;i<s.length()+1;i++){
int len = d[i-1].length();
//当前不与对称值相同
if(i-1-len==0||s.charAt(i-1)!=s.charAt(i-1-len-1)){
for(int j = 0;j<d[i-1].length()+1;j++){
if(s.charAt(i-1-len+j)==s.charAt(i-1)){
if(isSubPalindrone(s.substring(i-1-len+j,i))){
d[i] = s.substring(i-1-len+j,i);
break;
}
}
}
}
else{
d[i] = String.valueOf(s.charAt(i-1))+d[i-1]+String.valueOf(s.charAt(i-1));
}
}
int max = 0;
for(int i = 0;i<d.length;i++){
max = Math.max(d[i].length(),max);
}
for(int i = 0;i<d.length;i++){
if(d[i].length()==max)
return d[i];
}
return null;
}
boolean isSubPalindrone(String s){
int i = 0;
int j = s.length()-1;
while(i<j){
if(s.charAt(i)!=s.charAt(j))
return false;
i++;
j--;
}
return true;
}
}