leetcode——動態規劃

立志要熟練動態規劃,加油!css

  1. 最長迴文子串
    給定一個字符串 s,找到 s 中最長的迴文子串。你能夠假設 s 的最大長度爲 1000。

    思路:設dp[l][r]表示s[l……r]是否迴文,枚舉右邊界r,而後從0枚舉l一直到r,dp[r][l] = s[r]==s[l] && (r-1-l-1+1<=1 || dp[l+1][r-1]),意思是當s[r]和s[l]相等時,則須要s[l+1~r-1]也迴文,而若是l+1~r-1這一段長度小於等於1,那麼確定迴文,不然看dp[l+1][r-1]是否爲true便可,由於dp[l+1][r-1]是已經獲得的。

    c++:c++

    class Solution {
    public:
        string longestPalindrome(string s) {
            int len=s.length(),dp[1005][1005];
            if(len<=1)
                return s;
            for(int i=0;i<len;i++)
            {
                for(int j=0;j<len;j++)
                    dp[i][j]=0;
            }
            string ans=s.substr(0,1);
            int mx=1;
            for(int i=1;i<len;i++)
            {
                for(int j=0;j<i;j++)
                {
                    if(s[i]==s[j]&&(i-j-2+1<=1||dp[j+1][i-1]))
                    {
                        dp[j][i]=1;
                        if(i-j+1>mx)
                        {
                            ans=s.substr(j,i-j+1);
                            mx=i-j+1;
                       //     cout<<ans<<endl;
                        }
                    }
                }
            }
            return ans;
        }
    };
    
相關文章
相關標籤/搜索