交错字符串

题目描述

给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。
示例 1:
输入: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbcbcac”
输出: true

示例 2:
输入: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbbaccc”
输出: false

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/interleaving-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

用动态规划的方法。建立二维dp数组,dp[i][j]表示s1的0~ i-1与s2的0~ j-1构成的字符串能否构成s3的0~ i+j-1。表格如下所示。其中s1=“aabcc”,s2=“dbbca”,s3=“aadbbcbcac”。令dp[0][0]=true。
交错字符串_第1张图片
当i=0时,此时s1对应空串,s3只需匹配s2即可,此时dp[i][j]由前s2[j-2]个字符是否匹配前s3[i+j-2]个字符以及当前字符s2[j-1]是否与s3的当前字符s3[i+j-1]匹配决定,即dp[i][j]=dp[i][j-1]&&s2[j-1]==s3[i+j-1];

当j=0时,此时s2对应空串,s3只需匹配s1即可,此时dp[i][j]由前s1[i-2]个字符是否匹配前s3[i+j-2]个字符以及当前字符s1[i-1]是否与s3的当前字符s3[i+j-1]匹配决定,即dp[i][j]=dp[i-1][j]&&s1[i-1]==s3[i+j-1];

当i,j不为0时,s3需要匹配s1和s2,如果前s1[i-2]个字符与前s3[i+j-2]个字符匹配且当前字符s1[i-1]与s3的当前字符s3[i+j-1]匹配,或者前s2[j-2]个字符与前s3[i+j-2]个字符匹配且当前字符s2[i-1]与s3的当前字符s3[i+j-1]匹配,那么dp[i][j]=true,否则dp[i][j]=false,即dp[i][j]=(dp[i][j-1]&&s2[j-1]==s3[i+j-1])||(dp[i-1][j]&&s1[i-1]==s3[i+j-1])。

代码(c++)

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

你可能感兴趣的:(LeetCode)