当前位置:实例文章 » 其他实例» [文章]leetcode97. 交错字符串(算法:动态规划)

leetcode97. 交错字符串(算法:动态规划)

发布人:shili8 发布时间:2025-02-07 17:09 阅读次数:0

**交错字符串**

给定两个字符串 `s1` 和 `s2`,判断它们是否是交错的。两个字符串都是由相同数量的字符组成,并且每个字符串都只包含小写字母。

一个字符串是另一个字符串的交叉串如果它们的第一个字符相同,然后第二个字符相同,依此类推。如果其中一个字符串的长度比另一个短,那么它就是前几个字符的重复。

**示例**

* `s1 = "aabcc"`、`s2 = "dbcca"`,返回 `true`
* `s1 = "aabcc"`、`s2 = "cbca"`,返回 `false`

**动态规划**

我们可以使用动态规划来解决这个问题。我们创建一个二维数组 `dp` 来存储两个字符串的交叉结果。

def isInterleave(s1, s2):
 m, n = len(s1), len(s2)
 # 如果两个字符串长度之和不等于总长度,则返回 False if m + n != len(s1) + len(s2):
 return False dp = [[False] * (n +1) for _ in range(m +1)]
 # 初始化第一行和第一列 for i in range(m +1):
 dp[i][0] = s1[:i] == s2[:i]
 for j in range(n +1):
 dp[0][j] = s1[:j] == s2[:j]
 # 填充二维数组 for i in range(1, m +1):
 for j in range(1, n +1):
 if s1[i -1] == s2[j -1]:
 dp[i][j] = dp[i -1][j -1]
 elif (s1[i -1] == s2[j]) and not dp[i -1][j]:
 dp[i][j] = True elif (s2[j -1] == s1[i]) and not dp[i][j -1]:
 dp[i][j] = True return dp[m][n]


**注释**

* `m` 和 `n` 是两个字符串的长度。
* `dp` 是一个二维数组,用于存储两个字符串的交叉结果。
* 第一行和第一列是初始化好的,因为它们只涉及到一个字符串。
* 填充二维数组时,我们检查当前字符是否相同。如果相同,则使用上一次结果。如果不同,则检查哪个字符串的当前字符与前几个字符相等。

**测试**

print(isInterleave("aabcc", "dbcca")) # Trueprint(isInterleave("aabcc", "cbca")) # False


这个解决方案的时间复杂度是 O(m * n),其中 m 和 n 是两个字符串的长度。空间复杂度也是 O(m * n)。

相关标签:算法动态规划
其他信息

其他资源

Top