You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"))

代码原理拆解

  1. 去重处理:用set存储所有生成的子序列,因为原字符串可能有重复字符(比如"bell"里的两个l),不同位置组合可能生成完全一样的子序列,集合会自动帮我们去重。
  2. 生成所有子序列:借助itertools.combinations生成原字符串所有可能的位置组合,比如长度为3的组合会包含(0,1,2)(对应bel)、(0,2,3)(对应bll)、(1,2,3)(对应ell)等,再通过位置拼接得到子序列。
  3. 排序规则:最后用sorted函数,通过key=lambda x: (-len(x), x)实现先按长度降序,长度相同则按字典序升序排列,完美匹配你的示例要求。
  4. 适配任意长度:不管输入字符串是3个字符还是10个字符,这个逻辑都能正常工作,比如输入"aaa"会输出['aaa', 'aa', 'a'],输入"abc"会输出['abc', 'ab', 'ac', 'bc', 'a', 'b', 'c']。

内容的提问来源于stack exchange,提问作者nedla2004

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:29:48