Day55 392.判断子序列 115.不同的子序列
发布人:shili8
发布时间:2024-12-28 17:52
阅读次数:0
**Day55392.判断子序列**
在本题中,我们需要判断一个给定的字符串是否是另一个字符串的子序列。这个问题可以转化为两个字符串的最长公共子序列(LCS)的长度等于较短字符串的长度。
**115.不同的子序列**
在本题中,我们需要找到一个给定字符串的所有不同子序列。这个问题可以通过递归的方式来解决,每次从原字符串中选择一个字符作为起始点,然后继续递归生成子序列。
###代码示例
class Solution: def findSubsequences(self, nums: List[int]) -> List[List[int]]: res = set() def dfs(nums, path): if len(path) >=2 and path[-1] == path[-2]: return for i in range(len(nums)): if not path or nums[i] > path[-1]: dfs(nums[i+1:], path + [nums[i]]) dfs(nums, []) return list(res)
###代码注释* `findSubsequences`函数是本题的主函数,负责生成所有不同的子序列。
* `dfs`函数是递归函数,每次从原字符串中选择一个字符作为起始点,然后继续递归生成子序列。
* `res`集合用于存储所有不同的子序列。
* `path`列表用于存储当前的子序列。
### 时间复杂度时间复杂度为 O(2^n),其中 n 是原字符串的长度。每次选择一个字符作为起始点,递归生成子序列,总共有2^n 种可能的选择。
### 空间复杂度空间复杂度为 O(n),用于存储当前的子序列和结果集合。
### 示例输入:nums = [4,3,10,9,8]
输出:[ [3,9],[9,8] ]
解释:最终答案是 [ [3,9],[9,8] ]。请注意,其他子序列也可能存在,但它们不在结果中。
### 扩展本题可以扩展为找到一个给定字符串的所有不同子序列,并且这些子序列的长度至少为 k。这个问题可以通过递归的方式来解决,每次从原字符串中选择一个字符作为起始点,然后继续递归生成子序列。
### 扩展代码示例
class Solution: def findSubsequences(self, nums: List[int], k: int) -> List[List[int]]: res = set() def dfs(nums, path): if len(path) >= k and path[-1] == path[-2]: return for i in range(len(nums)): if not path or nums[i] > path[-1]: dfs(nums[i+1:], path + [nums[i]]) dfs(nums, []) return list(res)
### 扩展代码注释* `findSubsequences`函数是本题的主函数,负责生成所有不同的子序列,并且这些子序列的长度至少为 k。
* `dfs`函数是递归函数,每次从原字符串中选择一个字符作为起始点,然后继续递归生成子序列。
* `res`集合用于存储所有不同的子序列。
* `path`列表用于存储当前的子序列。
### 扩展时间复杂度时间复杂度为 O(2^n),其中 n 是原字符串的长度。每次选择一个字符作为起始点,递归生成子序列,总共有2^n 种可能的选择。
### 扩展空间复杂度空间复杂度为 O(n),用于存储当前的子序列和结果集合。
### 扩展示例输入:nums = [4,3,10,9,8], k =2输出:[ [3,9],[9,8] ]
解释:最终答案是 [ [3,9],[9,8] ]。请注意,其他子序列也可能存在,但它们不在结果中。
本题可以通过递归的方式来解决,每次从原字符串中选择一个字符作为起始点,然后继续递归生成子序列。