5. 最长回文子串 - 力扣(LeetCode)

枚举:(中心扩展法)

每次选取中心点(枚举),从中心点开始,用双指针往两边延伸,记录长度;更改中心点(复杂度o(n)),执行上述步骤,总复杂度O(n2)

ps:每个中心点扩展出去的回文子串可能有两种情况,奇数长度、偶数长度,因此在程序中按顺序考虑这两种情况。

class Solution {
public:
    string longestPalindrome(string s) {
        string res;//res存储结果:最长回文子串
        for(int i = 0; i<s.size(); i++){//逐个枚举中心点
            
            //双指针分别指向中心点左右两侧,用于查找奇数长度的回文子串
            int l = i-1, r = i+1;
            while(l>=0 && r<s.size() && s[l]==s[r])
                l--, r++;//满足条件就移动指针
            if(res.size()<r-l-1) 
                res = s.substr(l+1, r-l-1);//取子串更新res
            
            //重置双指针,准备寻找偶数长度的回文子串
            l = i, r = i+1;
            while(l>=0 && r<s.size() && s[l]==s[r]) 
                l--, r++;
            if(res.size()<r-l-1) 
                res = s.substr(l+1, r-l-1);
        }
        return res;//返回结果子串
    }
};