题目
给你一个字符串 s,找到 s 中最长的回文子串。
思路
- 关键点是理解回文串的定义
- 枚举每个数作为中点,向左右两边扩展,检测左右两端点是否相等,若是则尝试更新答案
- 由于回文串的中段可能有很多相同的字符,直接枚举他们作为中点会有大量重复迭代,所以可以先把这些数用右端点先直接迭代一遍,这样得到的回文子串也一定是最长的
代码
class Solution {
public:
string longestPalindrome(string s) {
int l=0,r=0,mid=0,begin=0,maxLen=0;
int n = s.size();
while(mid < n){ // 回文串以mid为中心
l = r = mid;
while(r+1 < n && s[r] == s[r+1]) r ++; // 先枚举回文串中间段相等的字符
mid = r + 1;
while(r + 1 < n && l - 1 >= 0 && s[l-1] == s[r+1]) l--, r++;
if(maxLen < r-l+1){
maxLen = r-l+1;
begin = l;
}
}
return s.substr(begin,maxLen);
}
};