leetcode 97. 交错字符串

设dp[i][j]表示s1的前i个与s2的前j个,能否组成s3的前i+j个即可。
s1[i]与s2[j]必有一个在末尾。所以判断他们与s3[i+j]的关系,即可写出转移方程

class Solution {
public:
    bool isInterleave(string s1, string s2, string s3) {
        int m=s1.size();
        int n=s2.size();
        // if(m==0&&n==0) return false;
        if(m+n!=s3.size()) return false;
        bool dp[m+3][n+3];
        memset(dp,0,sizeof(dp));
        dp[0][0]=1;
        for(int i=1;i<=m;i++)
        {
            if(s1[i-1]==s3[i-1])
            {
                dp[i][0]=dp[i-1][0];
            }
        }
        for(int j=1;j<=n;j++)
        {
            if(s2[j-1]==s3[j-1])
            {
                dp[0][j]=dp[0][j-1];
            }
        }
        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(s1[i-1]==s2[j-1]&&s1[i-1]==s3[i+j-1])
                {
                    dp[i][j]=dp[i-1][j]||dp[i][j-1];
                }
                else if(s1[i-1]==s3[i+j-1])
                {
                    dp[i][j]=dp[i-1][j];
                }
                else if(s2[j-1]==s3[i+j-1])
                {
                    dp[i][j]=dp[i][j-1];
                }
                else
                {
                    dp[i][j]=0;
                }
            }
        }
        return dp[m][n];
    }
};

 

你可能感兴趣的:(LeetCode)