请解释此算法以获取字符串的所有排列
Posted
技术标签:
【中文标题】请解释此算法以获取字符串的所有排列【英文标题】:Please explain this algorithm to get all permutations of a String 【发布时间】:2012-12-10 02:51:05 【问题描述】:以下代码生成字符串的所有排列:
def permutations(word):
if len(word)<=1:
return [word]
#get all permutations of length N-1
perms=permutations(word[1:])
char=word[0]
result=[]
#iterate over all permutations of length N-1
for perm in perms:
#insert the character into every possible location
for i in range(len(perm)+1):
result.append(perm[:i] + char + perm[i:])
return result
你能解释一下它是如何工作的吗?我不明白递归。
【问题讨论】:
看起来你这里有一个缩进错误,另外,值得指出的是这段代码是在重新发明***。标准库中已经有itertools.permutations
:-) -- 虽然这并不能帮助您理解这段代码。
你说的“他”和“这个人”是什么意思?
@DavidRobinson 我认为这只是一种询问代码中发生了什么的“可爱”方式。我重写了问题,直接要求解释,我认为这是提问者想要的(并且已经收到)。
【参考方案1】:
算法是:
删除第一个字母 找出剩余字母的所有排列(递归步骤) 在每个可能的位置重新插入已删除的字母。递归的基本情况是单个字母。只有一种方法可以置换单个字母。
工作示例
假设起始词是bar
。
b
。
查找ar
的排列组合。这给出了ar
和ra
。
对于每个单词,将b
放在每个位置:
ar
-> bar
, abr
, arb
ra
-> bra
, rba
, rab
【讨论】:
【参考方案2】:我已经为下面的长度为 2 的字符串和长度为 3 的字符串编写了步骤。
排列('ab')
len('ab') is not <= 1
perms = permutations of 'b'
len('b') <= 1 so return 'b' in a list
perms = ['b']
char = 'a'
result = []
for 'b' in ['b']:
for 0 in [0,1]:
result.append('' + 'a' + 'b')
for 1 in [0,1]:
result.append('b' + 'a' + '')
result = ['ab', 'ba']
排列('abc')
len('abc') is not <= 1
perms = permutations('bc')
perms = ['bc','cb']
char = 'a'
result =[]
for 'bc' in ['bc','cb']:
for 0 in [0,1,2]:
result.append('' + 'a' + 'bc')
for 1 in [0,1,2]:
result.append('b' + 'a' + 'c')
for 2 in [0,1,2]:
result.append('bc' + 'a' + '')
for 'cb' in ['bc','cb']:
for 0 in [0,1,2]:
result.append('' + 'a' + 'cb')
for 1 in [0,1,2]:
result.append('c' + 'a' + 'b')
for 2 in [0,1,2]:
result.append('cb' + 'a' + '')
result = ['abc', 'bac', 'bca', 'acb', 'cab', 'cba']
【讨论】:
以上是关于请解释此算法以获取字符串的所有排列的主要内容,如果未能解决你的问题,请参考以下文章
剑指offer(C++)-JZ38:字符串的排列(算法-搜索算法)