我只是想为遇到这个问题的任何人发布一个简单的递归解决方案。可能不是最好的方法,但这对我来说更容易理解和实施。如果我错了,请纠正我。
def party(s:str, P:list, res:list) -> None :
"""Recursively generates all partitions of a given string"""
res.append(P+[s])
for i in range(1,len(s)):
party(s[i:],P+[s[:i]],res)
res = []
party("abcd",[],res)
print(res)
"""
[['abcd'], ['a', 'bcd'], ['a', 'b', 'cd'], ['a', 'b', 'c', 'd'],
['a', 'bc', 'd'], ['ab', 'cd'], ['ab', 'c', 'd'], ['abc', 'd']]
"""
它的工作原理如下:
给定一个字符串或它的子字符串,我们可以在它的每个字符创建两半之后拆分。
说:“abc”可以分为["a","bc"],["ab","c"]
我们将第一部分保存在中间分区P 和
对另一半递归调用party。
因为两半一起形成一个完整的分区,我们将其保存到res。
示例:
最初:s = "abc" 是一个有效的分区,保存到 res。
recr call: s = "bc", P = ["a"] ,所以 P +[s]= ["a","bc"] 也是有效的,保存到res。
继续拆分“bc”。
P = ["a","b"], s="c" 所以 P + [s] 也是有效的。等等……
recr call 3: s = "c", P = ["ab"], 所以P + [s] =["ab","c"] 也是有效的,保存到res
工作:
tests = ["abc","abcd","a"]
for t in tests:
res = []
party(t,[],res)
print(f'{t} -> {res} \n')
"""Output
abc -> [['abc'], ['a', 'bc'], ['a', 'b', 'c'], ['ab', 'c']]
abcd -> [['abcd'], ['a', 'bcd'], ['a', 'b', 'cd'], ['a', 'b', 'c', 'd'],
['a', 'bc', 'd'], ['ab', 'cd'], ['ab', 'c', 'd'], ['abc', 'd']]
a -> [['a']]
"""