解析
l为字符串长度
Max为最长回文子串长度
Max_R指向最长回文子串头部
Max_L指向最长回文子串尾部
p_r指向当前回文子串头部下标-1
p_l指向当前回文子串尾部下标+1
思路
遍历字符串s
假设s[i]为回文子串中心
则有两种情况
1、s[i]为中心(回文子串长度为奇数)
p_r=i-1
p_l=i+1
判断p_r,p_l是否越界
若不越界,则判断s[p_r]是否等于s[p_l]
若等于则将s[p_r],s[p_l]加入当前回文子串,p_r–,p_l++,返回上一步
若不等于则break
若越界,则break
判断当前回文子串长度是否大于Max
若大于,则Max_R,Max_L,Max更新
2、s[i],s[i+1]为中心(回文子串长度为偶数)
p_r=i
p_l=i+1
判断p_l是否越界
若不越界,则判断s[p_r]是否等于s[p_l]
若等于则将s[p_r],s[p_l]加入当前回文子串,p_r–,p_l++,返回上一步
若不等于则break
若越界,则break
判断当前回文子串长度是否大于Max
若大于,则Max_R,Max_L,Max更新
代码
#include <string>
class Solution {
public:
string longestPalindrome(string s) {
int l=s.size(),p_r,p_l,Max=1,Max_R,Max_L;
for(int i=0;i<l;i++){
p_r=i-1;
p_l=i+1;
while((p_r>=0 && p_l<l) && s[p_r]==s[p_l]){//最长回文子串长度为奇数
p_r--;
p_l++;
}
if(p_l-p_r-1>=Max){
Max_R=p_r+1;
Max_L=p_l-1;
Max=Max_L-Max_R+1;
}
if(i+1<l){//最长回文子串长度为偶数
p_r=i;
p_l=i+1;
while((p_r>=0 && p_l<l) && s[p_r]==s[p_l]){
p_r--;
p_l++;
}
if(p_l-p_r-1>=Max){
Max_R=p_r+1;
Max_L=p_l-1;
Max=Max_L-Max_R+1;
}
}
}
return s.substr(Max_R,Max);
}
};