leetcode 5 Longest Palindromic Substring

原题:
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
大意:
给你字符串,让你找出最大的回文子串。

class Solution
{
    bool dp[1001][1001];
public:
    string longestPalindrome(string s)
    {
        if(s.size()==1)
            return s;
        int len=s.size();
        memset(dp,false,sizeof(dp));
        for(int i=0;i<len;i++)
            dp[i][i]=true;
        int str=0,l=1;
        for(int i=0;i<len-1;i++)
        {
            if(s[i]==s[i+1])
            {
                dp[i][i+1]=true;
                str=i;
                l=2;
            }
        }
        for(int k=3;k<=len;k++)
        {
            for(int i=0;i<len-k+1;i++)
            {
                int j=k+i-1;
                if(s[i]==s[j]&&dp[i+1][j-1])
                {
                    dp[i][j]=true;
                    str=i;
                    l=k;
                }
                else
                    dp[i][j]=false;
            }
        }
        return s.substr(str,l);
    }
};

解答:
刚看到的想法是先枚举每个子串,然后判断该子串是否是回文,并更新长度,时间复杂度应该是o(n^2)。结果超时了,可能是因为我用stl的缘故吧。考虑用动态规划的思想,根据以前做过的区间dp的思想。设置状态dp[i][j]表示i到j是否是一个回文子串,然后判断如果dp[i+1][j-1]是一个回文子串,而且s[i]==s[j],那么dp[i][j]肯定也是,否则dp[i][j]设置为false。
这里注意边界和初始化的问题,dp[i+1][j-1]状态转移的时候对长度为2的字符串没法控制,所以先判断s[i]是否等于s[i+1]。

我感觉应该有o(n)的算法,结果看discuss还真有。
此算法连接
http://www.felix021.com/blog/read.php?2040

你可能感兴趣的:(LeetCode,String)