剑指 Offer II 096. 字符串交织

剑指 Offer II 096. 字符串交织

题目描述:
在这里插入图片描述
在这里插入图片描述
解题思路:f[i][j]表示s3[i + j +1]可以由s1[0],s1[1]…s1[i]和 s2[0],s2[1]…s2[j]交织组成,当s3[i + j +1]=s1[i]时,f[i][j]=f[i - 1][j];当s3[i + j + 1]=s2[j]时,f[i][j]=f[i][j-1];于是状态方程组:
f[i][j]=(s1[i]==s3[i + j +1] && f[i-1][j]) || (s2[j]==s3[i + j + 1] && f[i][j - 1])
注意:这里的f[0][0]这些并不表示由s1[0]和s2[0]交织组成,指的是空字符串。下标直接从0开始,f[i-1][j]和f[i][j-1]可能会产生下标越界,所以我们从1开始,即f[0][0]表示空字符s3是否可以由空字符串s1和s2组成,显然是可以的,所以f[0][0]=true;其它的见注释。

class Solution {
    final static int N = 110;
    boolean[][] f = new boolean[N][N];
    public boolean isInterleave(String s1, String s2, String s3) {
        int n = s1.length(), m = s2.length(), t = s3.length();
        if(n + m != t) {
            return false;
        }
        for(int i = 0; i < n && s1.charAt(i) == s3.charAt(i); i++) {
            f[i][0] = true;
        }
        for(int j = 0; j < m && s2.charAt(j) == s3.charAt(j); j++) {
            f[0][j] = true;
        }
        f[0][0] = true;
        for(int i = 0; i <= n; i++) {
            for(int j = 0; j <= m; j++) {
                // i + j -1 = (i - 1) + j 或 (j - 1) + i,因为真正有效的长度是从1开始的,所以s3的下标就由s1和s2的下标相加
                if(i > 0) {
                    if(s1.charAt(i - 1) == s3.charAt(i + j - 1) && f[i - 1][j]) {
                        f[i][j] = true;
                    }
                }
               if(j > 0) {
                    if(s2.charAt(j - 1) == s3.charAt(i + j - 1) && f[i][j - 1]) {
                        f[i][j] = true;
                    }
               }
            }
        } 
        return f[n][m];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值