如何获取字符串中所有可能的字符组合
所以我有一个这样的字符串:
"abc"
我会需要:
"abc"
"acb"
"bca"
"bac"
"cab"
"cba"
我试过:
string = "abc"
combinations = []
for i in range(len(string)):
acc = string[i]
for ii in range(i+1,i+len(string)):
acc += string[ii%len(string)]
combinations.append(acc)
combinations.append(acc[::-1])
print(combinations)
如果适用于大小为 3 的字符串,但我认为它非常低效并且也不适用于"abcd". 有没有更好的方法?
更新:我想通过提供算法来解决。实际上目前正在以递归方式解决它。更喜欢不是python函数的解决方案为我解决问题
回答
对于排列:
使用 Itertools 库:
from itertools import permutations
ini_str = "abc"
print("Initial string", ini_str)
permutation = [''.join(p) for p in permutations(ini_str)]
print("Resultant List", str(permutation))
初始字符串 abc
结果列表 ['abc', 'acb', 'bac', 'bca', 'cab', 'cba']
递归方法:
def permutations(remaining, candidate=""):
if len(remaining) == 0:
print(candidate)
for i in range(len(remaining)):
newCandidate = candidate + remaining[i]
newRemaining = remaining[0:i] + remaining[i+1:]
permutations(newRemaining, newCandidate)
if __name__ == '__main__':
s = "ABC"
permutations(s)
迭代法:
def permutations(s):
partial = []
partial.append(s[0])
for i in range(1, len(s)):
for j in reversed(range(len(partial))):
# remove current partial permutation from the list
curr = partial.pop(j)
for k in range(len(curr) + 1):
partial.append(curr[:k] + s[i] + curr[k:])
print(partial, end='')
if __name__ == '__main__':
s = "ABC"
permutations(s)