LeetCode 5 Longest Palindromic Substring

求最大回文串

1最初想用最长公共子序列,但是有问题,怎么改??

2 动态规划

根据回文串的性质,如果s[i+1]-s[j-1]为回文串,并且s[i]==s[j],那么我们可以得到s[i]-s[j]为回文串。但是这里要注意初始化问题:单个字母一定是回文串。并且由于s[i+1]-s[j-1]的间隔为2,所以两个连续的字母必须单独来考虑。同时,dp[i][j]的状态是由dp[i+1][j-1]推出,所以i要从后往前

class Solution {
public:
    string longestPalindrome(string s) {
    
    int len=s.length();
    vector<vector<int>> dp(len, vector<int>(len, 0));
    int start=0,maxn=1;
    for(int i=0;i<len;i++)
    {
        dp[i][i]=1;
        if(i+1<len&&s[i]==s[i+1])
        {
            dp[i][i+1]=1;
            start=i;
            maxn=2;
        }
    }
    for(int i=len-2;i>=0;i--)
    {
        for(int j=i+2;j<len;j++)
        {
            if(s[i]==s[j]&&dp[i+1][j-1]==1)
            {
                dp[i][j]=1;
                if(j-i+1>maxn)
                {
                    start=i;
                    maxn=j-i+1;
                }
                
            }
        }
    }
    return s.substr(start,maxn);
    }
};

3 马拉车

posted @ 2018-04-08 21:16  blueattack  阅读(105)  评论(0编辑  收藏  举报