给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母组成
思路:
- 枚举中心点位置
- 当回文子串长度为奇数时,以i为中心开始往两边扩散,直到s[l]!=s[r],此时所得即为以i为中心的最长回文子串
- 当回文子串长度为偶数时,以i和i+1为中心开始往两边扩散,直到s[l]!=s[r],此时所得即为以i和i+1为中心的最长回文子串
- 更新最长回文子串
代码:
class Solution {
public:
string longestPalindrome(string s) {
string last_str; //我们记录的最长子串
int len=s.size();
//枚举回文子串的中心点,以子串长度为奇数和偶数这两种情况进行计算
for(int i=0;i<len;i++){
int l=i-1,r=i+1; //当子串长为奇数时以i为中心进行枚举
while(l>=0&&l<len&&r>=0&&r<len){
if(s[l]==s[r]){
l--,r++;
}else{
break;
}
}
string str=s.substr(l+1,(r-1)-(l+1)+1); //截取下标从l+1开始,长度为(r-1)-(l+1)+1的子串
if(str.size()>last_str.size()){ //更新最长回文子串
last_str=str;
}
l=i,r=i+1; //当子串长为偶数时,以i和i+1位中心进行枚举
while(l>=0&&l<len&&r>=0&&r<len){
if(s[l]==s[r]){
l--,r++;
}else{
break;
}
}
str=s.substr(l+1,(r-1)-(l+1)+1);
if(str.size()>last_str.size()){
last_str=str;
}
}
return last_str;
}
};