leetcode 87

题意:

 

 

题解:

这道题可以通过dp求解,我们定义dp[i][j][k]为s1中下标i开始,s2中下标j开始,且长度为k的两个子字符串是否为扰乱字符串

然后我们可以发现dp[i][j][k]的求解可以分为两种情况,一种是这两个子字符串分别被分割为两个字符串,且被分割的两个子字符串不进行替换就和另外一个相等

另一种是需要经过替换才会相等。

class Solution {
public:
    bool isScramble(string s1, string s2) {
        int l1=s1.size();
        int l2=s2.size();
        if(l1==0&&l2==0)
            return true;
        if(l1!=l2)
            return false;
        vector<vector<vector<int>>> dp(l1,vector<vector<int>>(l2,vector<int>(l1+1,0)));
        for(int k=1;k<=l1;k++)
        {
            for(int i=0;i+k-1<l1;i++)
            {
                for(int j=0;j+k-1<l2;j++)
                {
                    if(k==1)
                    {
                        if(s1[i]==s2[j])
                            dp[i][j][k]=1;
                        else
                            dp[i][j][k]=0;
                    }
                    else
                    {
                        for(int n=1;n<k;n++)
                        {
                            if((dp[i][j+k-n][n]&&dp[i+n][j][k-n])||
                               (dp[i][j][n]&&dp[i+n][j+n][k-n]))
                            {
                                dp[i][j][k]=1;
                                break;
                            }
                        }
                    }
                }
            }
        }
        if(dp[0][0][l1])
            return true;
        else
            return false;
    }
};

猜你喜欢

转载自www.cnblogs.com/QingFengDaHui/p/12465495.html
今日推荐