Python 3中有序字符串的所有不等子集求解
解决方案:生成有序字符串的去重子集并按长度降序排列
我完全懂你的需求啦——就是要提取给定字符串的所有非空子序列(不用管原字符是否相邻,但要保持它们在原字符串里的相对顺序),还要自动去掉重复的结果,最后按子序列长度从长到短排列对吧?刚好我有个能适配任意长度输入的Python实现,先看效果,再给你拆解细节:
示例验证
先拿你给的输入"bell"测试,运行代码后输出和你预期的完全一致:
['bell', 'bel', 'bll', 'ell', 'be', 'bl', 'el', 'll', 'b', 'e', 'l']
完整代码实现
from itertools import combinations def get_sorted_subsets(input_str): # 用集合存子集,自动去重 unique_subsets = set() str_length = len(input_str) # 从最长到最短遍历子集长度 for subset_length in range(str_length, 0, -1): # 生成所有长度为subset_length的位置组合 for indices in combinations(range(str_length), subset_length): # 按位置拼接字符,得到子序列 current_subset = ''.join([input_str[i] for i in indices]) unique_subsets.add(current_subset) # 按长度降序排序,长度相同则按字典序升序排列 sorted_result = sorted(unique_subsets, key=lambda x: (-len(x), x)) return sorted_result # 测试用例 print(get_sorted_subsets("bell"))
代码原理拆解
- 去重处理:用
set存储所有生成的子序列,因为原字符串可能有重复字符(比如"bell"里的两个l),不同位置组合可能生成完全一样的子序列,集合会自动帮我们去重。 - 生成所有子序列:借助
itertools.combinations生成原字符串所有可能的位置组合,比如长度为3的组合会包含(0,1,2)(对应bel)、(0,2,3)(对应bll)、(1,2,3)(对应ell)等,再通过位置拼接得到子序列。 - 排序规则:最后用
sorted函数,通过key=lambda x: (-len(x), x)实现先按长度降序,长度相同则按字典序升序排列,完美匹配你的示例要求。 - 适配任意长度:不管输入字符串是3个字符还是10个字符,这个逻辑都能正常工作,比如输入
"aaa"会输出['aaa', 'aa', 'a'],输入"abc"会输出['abc', 'ab', 'ac', 'bc', 'a', 'b', 'c']。
内容的提问来源于stack exchange,提问作者nedla2004
相关产品推荐
相关产品推荐

