内容:
1、动态规划
核心思想:
一个长回文串,去除两边,一定还是个回文串。(如acbca,去掉两边的a,cbc也依然是回文串)。根据该条规则,能得出判断一个字符串时回文串的两个条件,:①两边字符相等②去掉两边字符后的字符串依然是个回文串或者空字符串。
由此可以从底向上推,先将a、c、b、c、a五个字符分别标记成回文子串,然后从第一个
a开始取ac、cb、bc、ca,根据上面两个规则,发现没有回文串,继续循环。再扩展截取字符长度取acb、cbc、bca,根据上面两个规则,发现cbc符合所有条件,做记录,继续循环。扩展截取字符长度取acbc、cbca,发现没有回文串,继续循环。扩展截取字符长度取acbca,发现符合条件,判断该字符串长度大于上一次记录的cbc,覆盖记录,继续循环,循环结束,返回结果。
class Solution {
public String longestPalindrome(String s) {
int len = s.length();
int maxLength = 1;
int begin = 0;
if(len<2){
return s;
}
boolean[][] sign = new boolean[len][len];
for(int i = 0;i < len;i++){
sign[i][i] = true;
}
for(int i = 2;i <= len;i++){
for(int j = 0;j < len;j++){
int right = j + i - 1;
if(right>=len){
break;
}
if(s.charAt(j)==s.charAt(right)){
if(right-j<3){
sign[j][right] = true;
}else{
sign[j][right] = sign[j+1][right-1];
}
}
if(sign[j][right] && (right - j + 1) > maxLength){
begin = j;
maxLength = right - j + 1;
}
}
}
return s.substring(begin,begin+maxLength);
}
}
时间复杂度O(n^2),空间复杂度O(n^2),n为字符串长度