【second】Scramble String

三维DP。

重复子问题->DP

    bool isScramble(string s1, string s2) {
        // Note: The Solution object is instantiated only once and is reused by each test case.
        if(s1.size()!=s2.size())
            return false;
        if(s1.empty())
            return true;
        
        int n = s1.size();
        vector<vector<vector<bool>>> dp(n,vector<vector<bool>>(n,vector<bool>(n,false)));
        int i,j,k,len;
        
        for(i=0;i<n;i++)
            for(j=0;j<n;j++)
                dp[i][j][0] = (s1[i]==s2[j]?true:false);
        
        for(len=1;len<n;len++)
        {
            for(i=0;i<=n-len-1;i++)
            {
                for(j=0;j<=n-len-1;j++)
                {
                    if(s1.substr(i,len+1)==s2.substr(j,len+1))
                        dp[i][j][len] = true;
                    else
                    {
                        for(k=1;k<len+1;k++)
                        {
                            if((dp[i][j][k-1]&&dp[i+k][j+k][len-k])||(dp[i][j+len-k+1][k-1]&&dp[i+k][j][len-k]))
                            {
                                dp[i][j][len] = true;
                                break;
                            }
                        }                 
                    }

                }
            }
        }
        
        return dp[0][0][n-1];
        
    }

  

posted @ 2013-10-25 15:30  summer_zhou  阅读(130)  评论(0编辑  收藏  举报