5.最长回文子串

1、动态规划算法

5.最长回文子串

class Solution {
public:
    string longestPalindrome(string s) {
        int len=s.size();
        if(len==0||len==1) return s;
        int start=0;
        int max=1;
        vector<vector<int>> dp(len,vector<int>(len));
        for(int i=0;i<len;i++)   //初始化主对角线和次对角线
        {
            dp[i][i]=1;
            if(i<len-1&&s[i]==s[i+1])
            {
                dp[i][i+1]=1;
                max=2;
                start=i;
            }
        }
        for(int l=3;l<=len;l++)   
        {
            for(int i=0;i+l-1<len;i++)
            {
                int j=l+i-1;
                if(s[i]==s[j]&&dp[i+1][j-1]==1)
                {
                    dp[i][j]=1;
                    start=i;
                    max=l;
                }
            }
        }
        return s.substr(start,max);
    }
};

2、中心扩展算法

长度为n的字符串共有2n-1个中心扩展点,比如“abc”中心扩展点为b,“abba”中心扩展点为“bb”。

class Solution {
public:
    string longestPalindrome(string s) {
        if(s.size()==0)
            return "";
        int start=0;
        int max=1;
        for(int i=0;i<s.size();i++)
        {
            int len1=expandAroundCenter(s,i,i);  //奇数扩展
            int len2=expandAroundCenter(s,i,i+1);   //偶数扩展
            int len=len1>len2?len1:len2;
            if(len>=max)
            {
                start=i-(len-1)/2;
                max=len;
            }
        }
        return s.substr(start,max);
        
    }
    int expandAroundCenter(string s,int left,int right)
    {
        while(left>=0&&right<s.size()&&s[left]==s[right])    //注意边界条件防止越界
        {
            --left;
            ++right;
        }
        return right-left-1;   //注意返回值
    }
};