1,思路
首先,最容易的判断回文的思路,就是从收尾向中间收缩判断。
这样的时间复杂度为O(n^2);
通过分析,我们发现,其实做了很多的重复计算。比如0-1 0-2 0-3 则都将之前的判断了一次。
换个思路:
从中间向两边判断。然后逐个判断记录最长
这时候,需要注意将是回文为奇数长度和偶数长度的区别出来
2,代码如下
class Solution {
public:
int getMaxPalindromic(string &s,int i){
int index1 = i;
int index2 = i+1;
int max = 0;
int cnt = 0;
while(index1 >= 0 && index2 < s.size() && s[index1] == s[index2]){
cnt += 2;
index1 --;
index2 ++;
}
if(max < cnt){
max = cnt;
}
index1 = i-1;
index2 = i+1;
cnt = 1;
while(index1 >= 0 && index2 < s.size() && s[index1] == s[index2]){
cnt += 2;
index1 --;
index2 ++;
}
if(max < cnt){
max = cnt;
}
return max;
}
string longestPalindrome(string s) {
int max = 0;
string res = "";
int pos = -1;
for(int i = 0; i < s.size(); i++){
int t = getMaxPalindromic(s,i);
if(max < t){
max = t;
pos = i;
}
}
//是偶数长度
if(max % 2 == 0){
res = s.substr(pos-(max/2-1),max);
}else{
res = s.substr(pos-max/2,max);
}
return res;
}
};