给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:

  1. 输入: "babad"
  2. 输出: "bab"
  3. 注意: "aba" 也是一个有效答案。

示例 2:

输入: "cbbd"
输出: "bb"

暴力超时法

class Solution {
public:
    string longestPalindrome(string s) {
        int length = 0;
        string res;

        for(int i = 0; i<s.size(); i++){
            // dp = dp + 1;
            int left = i;

            for(int j = left; j>=0; j--){
                if(isHuiwen(s.substr(j, i - j + 1))){
                    // dp = dp + 1;

                    if(i - j + 1 > length){
                        res = s.substr(j, i - j + 1);
                        length = max(length, i - j + 1);
                    }
                }
            }
            // cout<<i<<" "<<dp<<endl;
        }
        return res;

    }

    bool isHuiwen(string s){
        int left = 0;
        int right = s.size() - 1;
        while(left< right){
            if(s[left] != s[right]){
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
};

中心扩展法

class Solution {
public:
    string longestPalindrome(string s) {
        int n = s.size(), ans = 0;
        int length = 0 ;
        string res;
        for (int i = 0; i < 2 * n - 1; ++i) {
            int l = i / 2, r = i / 2 + i % 2;
            bool flag = true;

            while (l >= 0 && r < n && s[l] == s[r]) {
                --l;
                ++r;
                ++ans;
            }
            cout<<"l "<<l<<endl;

            if(length < r - l - 1){ 
                res = s.substr(l + 1, r - l - 1);
                length = r -l -1;
            }
        }
        return res;
    }

};