CodeWars(12-LV4)

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
  1. 抄袭的代码不去分析,在这感谢答案让我看到其他优秀答案。

  2. 第一名代码利用python自带迭代器模块,不去分析代码,下面会给出该模块常用函数。

  3. 第二名代码可以好好分析一下,这里利用了递归思想。算法思路:

    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.完成上诉代码。

    完成操作!

  4. 它的核心思路就是一个一个进行添加,然后利用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)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • PYTHON-进阶-ITERTOOLS模块小结转自wklken:http://wklken.me/posts/20...
    C_Y_阅读 4,726评论 0 2
  • Since Jan.26th,2016 1、ubuntu 下运行 python 的几种方式 在 terminal...
    Rco阅读 7,442评论 0 2
  • 内置函数Python解释器内置了许多功能和类型,总是可用的。他们是按字母顺序列在这里。 abs(x)返回一个数的绝...
    uangianlap阅读 5,080评论 0 0
  • 弱肉强食,适者生存? 很多人都用这句话来刺激自己,甚至逼迫自己去融入环境,适应环境,他们认为这样才是成功,或者说这...
    宝藏男孩儿阅读 1,720评论 0 0
  • 卸下, 释放, 清理, 那些不再服务于你的东西。 让自己变得像羽毛一样轻盈。 继续 迎面 相碰 当下未知的世界 有...
    贤母堂赵欣柔阅读 1,562评论 0 0

友情链接更多精彩内容