和我一起刷leetocde-97-Interleaving-String

和我一起刷leetocde-97. Interleaving String

大家好,今天我们一起做Leetcode第97题 ,这也是一道难度为Hard的题目。这一题和我们昨天说的Leetcode第72题 非常非常的像。用昨天的方法来分析,很快就能做出来。

不要看到难度是hard就怕啦,hard里面也有很多套路题。在看解析前先自己动手做一做吧!

题目描述

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

Example 1:

Input: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
Output: true
Example 2:

Input: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
Output: false

首先解释一下"interleaving"这个单词,是“交织"的意思。 那么是单词的交织呢,我们这里举一个简单的例子:有两个字符串"ab"和"cd", 那么字符串"acbd"或者字符串"abcd"都可以看作是由"ab"和"cd"交织出来的。但是字符串"adcb"或者"abdc"就不是,因为你把它拆出来两个字符串的话,第二个字符串就变成"dc"了。

Leetcode这道题的题意是:给定两个字符串s1和s2,判断第三个字符串s3是不是s1和s2的交织。

动态规划三部曲

昨天的文章里说到:“大部分的字符串题都可以用动态规划解决,而且绝大多数能用动态规划解决的字符串题都采用二维数组。” 今天这一题又是一个典型的用二维数组解决字符串问题的例子。再一次验证了我昨天这个论断的正确性。

那我们还是老一套,动态规划三部曲,冲冲冲🐛:

开数组

在开数组之前,这一题我们要做一个基本的判断。如果s1的长度与s2的长度之和不等于s3的长度,那么我们直接输出False,不需要做任何处理。以下我们的讨论都是基于s1的长度与s2的长度之和等于s3的长度这个大前提的。

动态规划第一步,开数组并且清晰的定义数组的含义。

这一题需要我们输出的应该是一个bool值,也就是True或者Fasle。 我们定义一个二维数组dp,明确数组元素dp[i][j]的含义:当字符串s1的长度为i,字符串s2的长度为j时,字符串s3的长度为i+j时候,此时s3是不是s1和s2的交织。

有同学要问了:这里我们可以不可以定义一个三维数组dp[i][j][k]呢? 其实是可以的,但是没必要。因为我们之前说过,s1和s2的长度之和一定要等于s3,所以用s3的长度必为i+j。开三维数组会浪费空间,而且空增代码的复杂度。

根据这个数组定义,我们最后输出的结果应该是dp[n1][n2],其中n1和n2分别为s1和s2的长度。 老样子,我们在开数组的时候,就应该预留多一个空位,否则数组下标会越界。

n1 = len(s1)
n2 = len(s2)
n3 = len(s3)
if n1 + n2 != n3:
    return False

dp = [[True]*(n2+1) for _ in range(n1+1)]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值