簡體   English   中英

如何獲取字符串中所有可能的字符組合

[英]How to get all possible combinations of characters in a String

所以我有一個這樣的字符串:

"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)

If 適用於大小為 3 的字符串,但我認為它的效率非常低,也不適用於"abcd" 有更好的方法嗎?

更新:我想通過提供算法來解決。 實際上目前正在以遞歸方式解決它。 更喜歡不是 python function 為我解決問題的解決方案

對於排列:

使用 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)

嘗試itertools.permutations

from itertools import permutations
print('\n'.join(map(''.join, list(permutations("abc", 3)))))

Output:

abc
acb
bac
bca
cab
cba

編輯:

對於算法:

string = "abc"
def combinations(head, tail=''):
    if len(head) == 0:
        print(tail)
    else:
        for i in range(len(head)):
            combinations(head[:i] + head[i+1:], tail + head[i])
combinations(string)

Output:

abc
acb
bac
bca
cab
cba

你的邏輯是正確的,但你想要的是排列,而不是組合。 嘗試:

from itertools import permutations

perms = permutations("abc", r=3)
# perms is a python generator and not a list.

如果需要,您可以輕松地從該生成器創建一個列表。

1. 使用來自itertoolspermutations

from itertools import permutations 
  
s = 'abc'
permutation = [''.join(p) for p in permutations(s)] 
print(permutation) 
# ['abc', 'acb', 'bac', 'bca', 'cab', 'cba']

2.實現算法

s = 'abc'
result = []

def permutations(string, step = 0):
    if step == len(string):
        result.append("".join(string))
    for i in range(step, len(string)):
        string_copy = [character for character in string]
        string_copy[step], string_copy[i] = string_copy[i], string_copy[step]
        permutations(string_copy, step + 1)

permutations(s)
print(result)
# ['abc', 'acb', 'bac', 'bca', 'cba', 'cab']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM