Details:
In this kata you have to create all permutations of an input string and remove duplicates, if present. This means, you have to shuffle all letters from the input in all possible orders.
example:
permutations('a'); # ['a']
permutations('ab'); # ['ab', 'ba']
permutations('aabb'); # ['aabb', 'abab', 'abba', 'baab', 'baba', 'bbaa']
The order of the permutations doesn't matter.
中文大概含義:
看例程秒懂~~
我自己的代碼如下:
這次我自己沒寫出來,感覺寫出來得半天時間(寫了兩個小時沒寫出來,大概思路有),這里偷懶直接從GitHub抄襲了。不解釋這段代碼,完全是葫蘆畫瓢的寫法,沒意思。
def permutations(input):
if (len(input) == 1):
return1 = [input]
return return1
runningPermutationList = []
tempPermutationList = []
starter1 = input[0] + input[1]
starter2 = input[1] + input[0]
runningPermutationList.append(starter1)
runningPermutationList.append(starter2)
nextInsertIndex = 2
numberOfPermutation = 1
while (nextInsertIndex < len(input)):
for i in range(0, len(runningPermutationList)):
for j in range(0, len(runningPermutationList[i]) + 1):
comboToAdd = StringInsert(runningPermutationList[i], j, input[nextInsertIndex])
tempPermutationList.append(comboToAdd)
runningPermutationList = []
for i in range(0, len(tempPermutationList)):
stringToAdd = tempPermutationList[i]
runningPermutationList.append(stringToAdd)
tempPermutationList = []
nextInsertIndex += 1
return list(set(runningPermutationList))
"""the set deletes duplicates"""
def StringInsert(parentString, insertLocation, thingToInsert):
finalString = parentString[0:insertLocation] + thingToInsert + parentString[insertLocation:]
return finalString
print(permutations('VCGS'))
第一名代碼:
import itertools
def permutations(string):
return list("".join(p) for p in set(itertools.permutations(string)))
第二名代碼:
def permutations(string):
if len(string) == 1: return set(string)
first = string[0]
rest = permutations(string[1:])
result = set()
for i in range(0, len(string)):
for p in rest:
result.add(p[0:i] + first + p[i:])
return result
抄襲的代碼不去分析,在這感謝答案讓我看到其他優秀答案。
第一名代碼利用python自帶迭代器模塊,不去分析代碼,下面會給出該模塊常用函數。
第二名代碼可以好好分析一下,這里利用了遞歸思想。算法思路:
input:[1,1,1,2]
從最后開始遞歸,往前一個一個開始添加。[1,2]-->>[ [1,2],[2,1] ]
利用set()和下標len([1,2])=2.完成上訴代碼。
把新來的[1]添加進[ [1,2],[2,1] ]-->>[ [1,1,2],[1,2,1],[2,1,1] ]
同樣利用set和下標len([1,1,2])=3.完成上訴代碼。
再把新來的[1]添加進[ [1,1,2],[1,2,1],[2,1,1] ]-->>[ [1,1,1,2],[1,1,2,1],[1,2,1,1],[2,1,1,1] ]
同樣利用set和下標len([1,1,2])=3.完成上訴代碼。
完成操作!
它的核心思路就是一個一個進行添加,然后利用set去過濾重復的。
補充知識:
一、笛卡爾積:itertools.product(*iterables[, repeat])
直接對自身進行笛卡爾積:
import itertools
for i in itertools.product('ABCD', repeat = 2):
print (''.join(i),end=' ')123
輸出結果:
AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD
print (”.join(i))這個語句可以讓結果直接排列到一起
end=’ ‘可以讓默認的輸出后換行變為一個空格
兩個元組進行笛卡爾積:
import itertools
a = (1, 2, 3)
b = ('A', 'B', 'C')
c = itertools.product(a,b)
for i in c:
print(i,end=' ')123456
輸出結果:
(1, ‘A’) (1, ‘B’) (1, ‘C’) (2, ‘A’) (2, ‘B’) (2, ‘C’) (3, ‘A’) (3, ‘B’) (3, ‘C’)
二、排列:itertools.permutations(iterable[, r])
import itertools
for i in itertools.permutations('ABCD', 2):
print (''.join(i),end=' ')123
輸出結果:
AB AC AD BA BC BD CA CB CD DA DB DC
三、組合:itertools.combinations(iterable, r)
import itertools
for i in itertools.combinations('ABCD', 3):
print (''.join(i))123
輸出結果:
ABC
ABD
ACD
BCD
四、組合(包含自身重復):itertools.combinations_with_replacement(iterable, r)
import itertools
for i in itertools.combinations_with_replacement('ABCD', 3):
print (''.join(i),end=' ')123
輸出結果:
AAA AAB AAC AAD ABB ABC ABD ACC ACD ADD BBB BBC BBD BCC BCD BDD CCC CCD CDD DDD
注意!!!
函數是根據他們的位置來計算組合的,而不是他們的值.所以有重復的結果。
for i in permutations([1, 1, 3], 3):
print i
(1, 1, 3)
(1, 3, 1)
(1, 1, 3)
(1, 3, 1)
(3, 1, 1)
(3, 1, 1)