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)