回文串定义:正着念和反着看是一样的(一个字母也是回文串)
时间复杂度:O(n2)
空间复杂度:O(n2)
解题思路:动态规划(面试)
DP式:
这里的其他情况有两种:1.字串S不是回文串;2.i>j
动态规划的状态转移方程:
注意:在状态转移方程中,我们是从长度较短的字符串向长度较长的字符串进行转移的,因此一定要注意动态规划的循环顺序。
class Solution {
public String longestPalindrome(String s) {
int len = s.length();
int max_str_len = 1;
int begin = 0;
int end = 0;
char[] sc = s.toCharArray();
boolean[][] sign = new boolean[len][len];
if(len < 2){
return s;
}
//让每个单独字符串都标识为回文串
for(int i = 0; i < len; i++){
sign[i][i] = true;
}
//i表示回文串长度
for(int i = 2; i <= len; i++){
//j表示字符串开始位置
for(int j = 0; j < len; j++){
end = j + i -1;
//其他情况之一
if(end >= len){
break;
}
//其他情况之二(if)
if(sc[j] != sc[end]){
sign[j][end] = false;
}else{
// 考虑头尾去掉以后没有字符剩余,或者剩下一个字符的时候,肯定是回文串
if( end - j < 3){
sign[j][end] = true;
}else{
//核心:DP状态转移方程
sign[j][end] = sign[j + 1][end - 1];
}
}
if(sign[j][end] == true && i > max_str_len){
max_str_len = i;
begin = j;
}
}
}
return s.substring(begin , begin + max_str_len);
}
}
还有一个复杂度为O(n) 的Manacher 算法。然而本算法十分复杂,一般不作为面试内容。