首页 > 试题广场 >

字符串的全部子序列

[编程题]字符串的全部子序列
  • 热度指数:3667 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个字符串s,长度为n,求s的所有子序列
1.子序列: 指一个字符串删掉部分字符(也可以不删)形成的字符串,可以是不连续的,比如"abcde"的子序列可以有"ace","ad"等等
2.将所有的子序列的结果返回为一个字符串数组
3.字符串里面可能有重复字符,但是返回的子序列不能有重复的子序列,比如"aab"的子序列只有"","a","aa","aab","ab","b",不能存在2个相同的"ab"
4.返回字符串数组里面的顺序可以不唯一

数据范围:


要求:时间复杂度为

示例1

输入

"ab"

输出

["","a","ab","b"]

说明

返回["","b","a","ab"]也是可以的,视为正确,顺序不唯一 
示例2

输入

"dbcq"

输出

["","b","bc","bcq","bq","c","cq","d","db","dbc","dbcq","dbq","dc","dcq","dq","q"]
示例3

输入

"aab"

输出

["","a","aa","aab","ab","b"]

说明

返回的字符串数组里面不能存在"ab","ab"这样2个相同的子序列 
二进制数字选择法
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param s string字符串 
# @return string字符串一维数组
#
class Solution:
    def generatePermutation(self , s: str) -> List[str]:
        # write code here
        res_set = set()

        count = 0
        for i in range(2**len(s)):
            bin_s = bin(i)[2:]
            
            tmp = ''
            for j in range(len(bin_s)):
                if bin_s[j] == '1':
                    tmp += s[len(s)-len(bin_s) + j]

            res_set.add(tmp)

        res = list(res_set)
        return res


编辑于 2024-04-24 22:14:16 回复(0)
class Solution:
    def generatePermutation(self , s: str) -> List[str]:
        # write code here
        res = set()
        res.add("")
        def f(s, index, res, path):
            if index >= len(s):
                return 
            
            # 当前字符要
            res.add(path+s[index])
            f(s, index + 1, res, path+s[index])
            # 当前字符不要
            res.add(path)
            f(s, index + 1, res, path)
        f(s,0,res, '')
        return list(res)

编辑于 2024-03-17 20:34:35 回复(0)