(nice!!!)LeetCode 97. 交错字符串 (动态规划dp+滚动数组)

97. 交错字符串

在这里插入图片描述
在这里插入图片描述

来自大佬的图
在这里插入图片描述

思路:方法一,动态规划,v[i][j]表示的是s1中前i个字符和s2中前j个字符交错是否可以组合成s3中前i+j个字符。当s1的第i个字符和s3的第i+j个字符相等,那么v[i][j]的状态就由v[i-1][j]的状态决定;同理,当s2的第j个字符和s3的第i+j个字符相等,那么v[i][j]的状态就由v[i][j-1]的状态决定。

class Solution {
public:
    bool isInterleave(string s1, string s2, string s3) {
        int n=s1.size(),m=s2.size(),t=s3.size();
        if(n+m!=t) return false;//注意字符长度不等的时候
        vector<vector<bool>> v(n+1,vector<bool>(m+1,false));
        v[0][0]=1;
        
        for(int i=0;i<=n;i++){
            for(int j=0;j<=m;j++){
            //这里i和j表示的是前多少字符,所以一定需要大于0,才能访问字符串s1[i-1]和s2[j-1]
                if(i>0) v[i][j] =v[i][j] | (v[i-1][j]&&s1[i-1]==s3[i+j-1]);
                if(j>0) v[i][j] =v[i][j] | (v[i][j-1]&&s2[j-1]==s3[i+j-1]);
            }
        }
        return v[n][m];
    }
};

思路:方法二,动态规划+滚动数组,观察方法一可以发现,进行状态转移时,只用到了数组的第i层和第i-1层,也就是当前层和上一层。我们可以用一维素组来替代二维数组。

class Solution {
public:
    bool isInterleave(string s1, string s2, string s3) {
        int n=s1.size(),m=s2.size(),t=s3.size();
        if(n+m!=t) return false;
        vector<bool> v(m+1,false);
        v[0]=1;
        for(int i=0;i<=n;i++){
            for(int j=0;j<=m;j++){
                if(i>0) v[j] =(v[j]&&s1[i-1]==s3[i+j-1]);//注意这里不能在左边加v[j]|,不然影响(v[j]&&s1[i-1]==s3[i+j-1])这一块的处理。
                if(j>0) v[j] =v[j] | (v[j-1]&&s2[j-1]==s3[i+j-1]);
            }
        }
        return v[m];
    }
};
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值