Python 按字母顺序生成给定字符串的所有子字符串(按字典顺序)

Python 按字母顺序生成给定字符串的所有子字符串(按字典顺序),python,string,recursion,backtracking,Python,String,Recursion,Backtracking,我最近看到了这个问题,我真的很难实现它 问题是从给定的字符串生成所有可能的按字母顺序排列的子字符串 小示例:对于字符串xcv 我需要生成输出: c cv cvx v vx x 更大的示例:对于字符串hgte 我需要生成以下子字符串: e eg egh eghr eghrt eght egr egrt egt eh ehr ehrt eht er ert et g gh ghr ghrt ght gr grt gt h hr hrt ht r rt t 这是我的实现,它没有产生所需的输出 s=

我最近看到了这个问题,我真的很难实现它

问题是从给定的字符串生成所有可能的按字母顺序排列的子字符串

小示例:对于字符串
xcv

我需要生成输出:

c cv cvx v vx x
更大的示例:对于字符串
hgte

我需要生成以下子字符串:

e
eg
egh
eghr
eghrt
eght
egr
egrt
egt
eh
ehr
ehrt
eht
er
ert
et
g
gh
ghr
ghrt
ght
gr
grt
gt
h
hr
hrt
ht
r
rt
t
这是我的实现,它没有产生所需的输出

s=sorted(list(input()))
s=''。加入(s)
对于范围内的i(len(s)):
对于范围(i+1,len(s)+1)内的j:
温度=s[i:j]
打印(''.join(临时))
这是我的代码的输出:

e
eg
egh
eghr
eghrt
g
gh
ghr
ghrt
h
hr
hrt
r
rt
t
[]
我知道在打印
eghrt
之后必须使用回溯和递归,但我真的很难实现它。
提前感谢:

你忘记考虑非连续子字符串。一种简单的方法是使用itertools

import itertools

word = sorted(list(input()))
print(sorted(set([''.join(j) for i in range(len(word)) for j in itertools.combinations(word, i)])))

那就行了。如果您不想使用标准库,可以使用位屏蔽来获取所有可能的子字符串。

您可以迭代不同的长度,并使用
itertools.compositions
生成字母组合:

from itertools import combinations
s = sorted(input())
print(*sorted(''.join(c) for i in range(len(s)) for c in combinations(s, i + 1)), sep='\n')

如果递归不是明确的要求,您可以不使用递归:

from itertools import chain, combinations

def powerset(iterable):
    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))

for w in (''.join(sorted(x)) for x in powerset(s) ):
    print(w)

powerset
功能取自

,在较小的示例中,可能缺少几个组合(cxv、vcx、vxc等)。是吗?@RobertoCaboni这些不是按字母顺序排列的。不,字母应该按字母顺序排列在子字符串中,对不起,我将对我的问题添加限制。谢谢:)没有理由在这里使用集合。你是个天才,很棒的东西,如果可能的话,你能提供一些解释吗,非常感谢:)明白了,正如你所说的,
组合
是产生不同长度的字符串,我们在列表中对这些单词进行排序。你在代码中的某个地方用过
列表
作为变量名吗?然后您已经覆盖了内置的
列表
函数。不要。是的,对不起!您的代码更容易理解,非常感谢!