【ALGO】Leetcode 97.交错字符串

题面

原题链接
给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。
两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:
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 意味着字符串 a 和 b 连接。

解析

使用DP求解,令 f [ i ] [ j ] f[i][j] f[i][j]表示所有由 s 1 [ 1 ∼ i ] s1[1\sim i] s1[1i] s 2 [ 1 ∼ j ] s2[1\sim j] s2[1j]交错形成 s 3 [ 1 ∼ i + j ] s3[1\sim i+j] s3[1i+j]的方案,状态计算时关键判断 s 3 [ i + j ] s3[i+j] s3[i+j]的字符的来源为 s 1 s1 s1还是 s 2 s2 s2

AC代码

class Solution {
public:
    bool isInterleave(string s1, string s2, string s3) {
        int n=s1.size(), m=s2.size();
        if(s3.size()!=n+m) return false;

        bool f[n+1][m+1];
        memset(f, 0x00, sizeof f);
        s1=' '+s1, s2=' '+s2, s3=' '+s3;
        for(int i=0; i<=n; ++i)
            for(int j=0; j<=m; ++j)
                if(!i && !j) f[i][j]=true;
                else{
                    if(i && s1[i]==s3[i+j]) f[i][j]=f[i-1][j];
                    if(j && s2[j]==s3[i+j]) f[i][j]|=f[i][j-1];
                }
        return f[n][m];
    }
};
©️2020 CSDN 皮肤主题: 成长之路 设计师:Amelia_0503 返回首页
实付 99.00元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值