代码随想录算法训练营第55天 | 动态规划 part15 ● 392.判断子序列 ● 115.不同的子序列
发布人:shili8
发布时间:2025-01-06 08:43
阅读次数:0
**代码随想录算法训练营第55天 | 动态规划 part15**
**题目1:392.判断子序列**
给定两个字符串 `s` 和 `t`,判断 `t` 是否是 `s` 的子序列。
示例1:
输入: `s = "abc", t = "ahbgdc"`
输出: `true`
示例2:
输入: `s = "axc", t = "ahbgdc"`
输出: `false`
**思路**
我们可以使用动态规划来解决这个问题。我们维护一个长度为 `len(s) +1` 的数组 `dp`,其中 `dp[i]` 表示 `t` 是否是 `s[:i]` 的子序列。
初始状态:`dp[0] = true`
递归关系:
* 如果 `s[i-1] == t[j-1]`,则 `dp[i] = dp[i-1]`
* 否则,`dp[i] = false`
**代码**
def isSubsequence(s: str, t: str) -> bool: n, m = len(s), len(t) dp = [False] * (n +1) # 初始化状态 dp[0] = True for i in range(1, n +1): if s[i-1] == t[j-1]: dp[i] = dp[i-1] else: dp[i] = False return dp[n]
**题目2:115.不同的子序列**
给定一个字符串 `s`,返回所有可能的不同长度的子序列。
示例1:
输入: `s = "abc"`
输出: `[["", "a", "b", "c"], ["a", "ab", "ac", "abc"], ["b", "ba", "bc", "bab", "babc"], ["c", "ca", "cb", "cab", "cac", "cbac"]]`
示例2:
输入: `s = "aaa"`
输出: `[["", "a", "aa", "aaa"], ["a", "aa", "aaa"], ["aa", "aaa"], ["aaa"]]`
**思路**
我们可以使用动态规划来解决这个问题。我们维护一个长度为 `len(s) +1` 的数组 `dp`,其中 `dp[i]` 表示所有可能的不同长度的子序列。
初始状态:`dp[0] = [[]]`
递归关系:
* 如果 `s[i-1] == t[j-1]`,则 `dp[i].append(dp[i-1])`
* 否则,`dp[i].extend(dp[i-1])`
**代码**
def findSubsequences(s: str) -> List[List[str]]: n = len(s) dp = [[]] for i in range(1, n +1): if s[i-1] == t[j-1]: dp[i].append(dp[i-1]) else: dp[i].extend(dp[i-1]) return dp[n]
**总结**
在本文中,我们使用动态规划解决了两个问题:392.判断子序列和115.不同的子序列。我们维护一个长度为 `len(s) +1` 的数组 `dp`,其中 `dp[i]` 表示所有可能的不同长度的子序列或 `t` 是否是 `s[:i]` 的子序列。通过递归关系,我们可以计算出 `dp[i]` 的值,并返回最终结果。