和我一起刷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)]