给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
分析:
回文就是左右对称的字符串,我们只需要将每一个字母都进行对称性比较,最后将最长的字符串取出来就得到了结果。
对称有两种,一种是"aba"型,另一种是"abba"型,需要给每一个字符都计算这两种对称情况。
class Solution {
public:
string longestPalindrome(string s) {
// 每一个字符计算最大对称个数
if(s.size() == 0)
return "";
// 表示最大长度
int len_max = 0;
// 标识从哪一个字符开始对称
int index = 0;
for(int i=0; i<s.size(); i++){
int curr_len = 0;
// 中间字母对称,如 bab
for(int gap=0; gap<=i; gap++){
if((i+gap)<s.size() && s[i+gap] == s[i-gap]){
curr_len +=2;
continue;
}
break;
}
if(curr_len-1 > len_max){
index = i;
len_max = curr_len-1;
}
curr_len = 0;
// 两边字母对称,如 abba
for(int gap=0; gap<=i; gap++){
if((i+gap+1)<s.size() && s[i+gap+1]==s[i-gap]){
curr_len +=2;
continue;
}
break;
}
if(curr_len > len_max){
index = i;
len_max = curr_len;
}
}
// 截取字符串
return len_max%2?s.substr(index-(len_max-1)/2,len_max):s.substr(index-(len_max)/2+1,len_max);
}
};