当前位置:实例文章 » 其他实例» [文章]代码随想录算法训练营第55天 | 动态规划 part15 ● 392.判断子序列 ● 115.不同的子序列

代码随想录算法训练营第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]` 的值,并返回最终结果。

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

其他资源

Top