97. 交错字符串

97. 交错字符串

给定三个字符串 s1s2s3,请你帮忙验证 s3 是否是由 s1s2 交错 组成的。

两个字符串 st 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:

  • s = s1 + s2 + ... + sn
  • t = t1 + t2 + ... + tm
  • |n - m| <= 1
  • 交错s1 + t1 + s2 + t2 + s3 + t3 + ... 或者 t1 + s1 + t2 + s2 + t3 + s3 + ...

注意:a + b 意味着字符串 ab 连接。

示例 1:

img

输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
输出:true

示例 2:

输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
输出:false

示例 3:

输入:s1 = "", s2 = "", s3 = ""
输出:true

提示:

  • 0 <= s1.length, s2.length <= 100
  • 0 <= s3.length <= 200
  • s1s2、和 s3 都由小写英文字母组成

思路:

​ 我的思路是带备忘录的动态规划,与官方题解并不相同,但是官方题解的双指针动态规划更加巧妙。

class Solution {
public:
    vector<vector<int>>memo;
    bool isInterleave(string s1, string s2, string s3) {
        int m=s1.size();
        int n=s2.size();
        memo.resize(m+1,vector<int>(n+1,-1));//备忘录 -1 表示未计算 0表示false 1表示true
        if((m+n)!=s3.size())return false;
        return dp(s1,0,s2,0,s3);
    }
    bool dp(string s1,int i,string s2,int j,string s3){
        if(i+j==s3.size())return true;
        int k=i+j;
        if(memo[i][j]!=-1){
            return memo[i][j]==1?true:false;
        }
        bool res=false;
        //下面两种情况只要有一个满足即可
        if(i<s1.size()&&s1[i]==s3[k]){//如果s1[i]可以和s3[k]匹配
            res = res|dp(s1,i+1,s2,j,s3);//或运算 有一个为真即可
        }
        if(j<s2.size()&&s2[j]==s3[k]){//如果s2[j]可以和s3[k]匹配
            res= res|dp(s1,i,s2,j+1,s3);
        }
        memo[i][j]=res==true?1:0;//res为真就存1 否则就存0
        return res;
    }
};
posted @ 2022-05-28 09:20  BailanZ  阅读(55)  评论(0编辑  收藏  举报