LeetCode 97 交错字符串

题目大意是给三个字符串,问前两个字符串进行交错是否可以组成第三个字符串。我的思路就是用动态规划来做,用一个数组dp[i][j]表示匹配s3前i+1个字符时,用了j个s1的字符,s2可以推倒出来是用了i+1-j个字符,所以不用再开一维,两维就够了,第一次做多开了一维,时间和空间消耗都很大。更新dp数组的公式dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1)和dp[i][j]=max(dp[i][j],dp[i-1][j]+1);分别是匹配s3索引为i的字符时,用s1去匹配和用s2去匹配,要注意字符串的界限,不要越界。这样子做时间空间消耗都非常低。


class Solution {
public:
    bool isInterleave(string s1, string s2, string s3) {
        int len1 = s1.length(),len2 = s2.length(),len3 = s3.length();
        if(len3!=len1+len2) return false;
        if(len3==0) return true;
        int dp[len3+5][len1+5];
        memset(dp,0,sizeof(dp));
        if(s1[0]==s3[0]) dp[0][1]=1;
        if(s2[0]==s3[0]) dp[0][0]=1;
        for(int i=1;i<len3;i++)
        {
            for(int j=0;j<=len1&&j<=i+1;j++)
            if(j<=len1&&i-j+1<=len2)
            {
                if(j>0&&s1[j-1]==s3[i])
                dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1);
                if(i>=j&&s2[i-j]==s3[i])
                dp[i][j]=max(dp[i][j],dp[i-1][j]+1);
            }
        }
        if(dp[len3-1][len1]==len3) return true;
        else
        return false;
    }
};
原文地址:https://www.cnblogs.com/ambition-hhn/p/12938956.html