2017-04-05 38 views
4

我想将单词分成子词 - 所有可能的排列组合。将单词分解成所有可能的“子词” - 所有可能的组合

Input: Bang 
Output: [['B','ang'], ['Ba','ng'], ['Ban','g'], ['B','a','ng'], ['B','an','g'], ['Ba','n','g'], ['B','a','n','g']] 

我希望我涵盖所有possbile方式来安排'爆炸'。我想了很久,却找不到方法。

list(permutations('Bang', 3)) 

排列组合方法不返回整个单词。我可以分成2个单词,但无法将单词分成3个或更多(对于更大的单词)。

拆分成2个单词可以使用其中一个成员建议的以下代码完成。

[ [word[:i],word[i:]] for i in range(1,len(word))] 
+0

如果抽象地想到此,有三个地点,你可以拆分它们是独立的字符串彼此的。所以你可以从创建所有可能的字符串应该被拆分的列表开始,例如, G。 '['B','ang']''[True,False,False]'。然后从那里走回去。 – Joooeey

+0

请发布您的当前代码,包括您在多个拆分中的最佳尝试。 – Prune

回答

2

这里亚去..

def combos(s): 
    if not s: 
    return 
    yield (s,) 
    for i in range(1, len(s)): 
    for c in combos(s[i:]): 
     yield (s[:i],) + c 

for c in combos('Bang'): 
    print c 

输出:

('Bang',) 
('B', 'ang') 
('B', 'a', 'ng') 
('B', 'a', 'n', 'g') 
('B', 'an', 'g') 
('Ba', 'ng') 
('Ba', 'n', 'g') 
('Ban', 'g') 
+0

该解决方案看起来非常优雅。我会试着了解它是如何工作的。 – Aman

+0

谢谢 - 是啊玩!探索递归如何工作是一个很好的问题。 – Triptych