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