interleaving-string(交叉字符串)

版权声明:本文为自学而写,如有错误还望指出,谢谢^-^ https://blog.csdn.net/weixin_43871369/article/details/90746952

题目描述

Given s1s2s3, find whether s3 is formed by the interleaving of s1 and s2.

For example,
Given:
s1 ="aabcc",
s2 ="dbbca",

When s3 ="aadbbcbcac", return true.
When s3 ="aadbbbaccc", return false.

Solution 1

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

Solution 2

//常规算法
bool isInterleave(string s1, string s2, string s3) {
        if(s1.size()==0&&s2.size()==0&&s3.size()==0) return true;
        if(s3.size()==0) return false;
        if(s2.size()==0&&s1==s3) return true;
        if(s1.size()==0&&s2==s3) return true;
        if(s1.size()!=0&&s2.size()!=0&&s3.size()!=0)
        {
            if(s3[0]==s1[0]&&s3[0]==s2[0])
                return isInterleave(s1.substr(1,s1.size()),
                s2,s3.substr(1,s3.size()))||isInterleave(s1,s2.substr(1,s2.size()),
                     s3.substr(1,s3.size()));
            else if(s3[0]==s1[0]) return isInterleave(s1.substr(1,s1.size()),
                s2,s3.substr(1,s3.size()));
            else if(s3[0]==s2[0]) return isInterleave(s1,s2.substr(1,s2.size()),
                s3.substr(1,s3.size()));
            else return false;
        }
        return false;
    }

猜你喜欢

转载自blog.csdn.net/weixin_43871369/article/details/90746952
今日推荐