97. 交织字符串
题目起源:力扣(LeetCode)https://leetcode-cn.com/problems/interleaving-string
题目
给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交织组成的。
示例 1:
输出: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
输入: true
示例 2:
输出: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
输入: false
解题思路
思路:动静布局
在这里,咱们应用 不同门路 这道题的思维去解决问题,向下向右去挪动,求得是否存在这样的门路。
那么这个问题就能够转换为求证,s3 是否可能从向下选取 s1,向右选取 s2,这样的模式,去求得是否存在 s3 这条门路。
状态定义
设 dp[i][j]
示意 s1 前 i 个字符和 s2 前 j 个字符可能拼接成 s3(i+j) 个字符,也就是以后门路存在。
状态转移方程
如果 s1 的第 i 个元素和 s3 的第 i+j 个元素相等,那么 dp[i][j]
是否成立,则须要看 dp[i-1][j]
是否成立,也就是这里须要看 s1 的前 i-1 个元素和 s2 的前 j 个元素是否拼接成 s3 的前 i+j-1 个元素。
同样的 如果 s2 的第 j 个元素和 s3 的第 i+j 个元素相等,此时 dp[i][j]
是否成立,则须要看 dp[i][j-1]
是否成立,也就是须要看 s2 的前 i 个元素和 s2 的前 j-1 个元素是否可能拼接成 s3 的前 i+j-1 个元素。
那么最终的状态转移方程为:
dp[i][j] = (dp[i-1][j] and s3[i+j-1]=s1[i-1]) or (dp[i][j-1] and s3[i+j-1]=s2[j-1])
状态初始化
- dp0 = True
- 如果 j = 0,dpi 是否成立,取决于 dpi-1 以及 s1 的第 i 个字符是否等于 s3 的第 i 个字符;
- 如果 i = 0,dp0 是否成立,取决于 dp0 以及 s3 的第 i 个字符与 s2 的第 i 个字符是否相等。
具体的实现代码如下。
代码实现
class Solution:
def isInterleave(self, s1: str, s2: str, s3: str) -> bool:
# 先解决非凡状况,如果 s1 和 s2 的长度和不等于 s3 的长度,则返回 False。因为无奈交织拼接
if len(s1) + len(s2) != len(s3):
return False
m = len(s1)
n = len(s2)
# 状态定义
dp = [[False] * (n+1) for _ in range(m+1)]
# 初始化
dp[0][0] = True
for i in range(1, m+1):
dp[i][0] = dp[i-1][0] and s3[i-1] == s1[i-1]
for j in range(1, n+1):
dp[0][j] = dp[0][j-1] and s3[j-1] == s2[j-1]
for i in range(1, m+1):
for j in range(1, n+1):
dp[i][j] = (dp[i-1][j] and s3[i+j-1]==s1[i-1]) or (dp[i][j-1] and s3[i+j-1]==s2[j-1])
return dp[-1][-1]
实现后果
欢送关注
公众号【书所集录】