全排列字典法(python)
1.算法原理
字典序法指组合数字从小到大排列
比如当前排列为“1,2,3”,下一个排列就是“1,3,2”
找下一个排列的方法是:从这个序列中从右到左找第一对左侧数字小于右侧数字的一对数,记较小的数的位置为i,如果找不到,则说明所有排列求解完成,如果找得到,则说明排列未完成。
之后从右往左找一个比当前数字对中较小的数大的数,将其位置记为j,再将i,j位置上的数交换。
之后将i+1至最后一个元素从小到大排序,得到当前数的下一个排列数。
下图是用字典法找123的全排列
2.代码实现
首先想到构建两个函数,一个函数求当前排列数的下一个;另一个函数不断迭代,调用上一个函数。
import numpy
def findnext (string) :
a = 0
b = 0
##从右往左,找到第一个左边小于右边的数,设为a
for i in range(len(string)-1,0,-1):
if string[i-1] < string[i]:
a = string[i-1]
break
if a == 0:
return None
else:
for j in range(len(string)-1,-1,-1):
if string[j] > a:
b = string[j]
break
string[i-1] = b
string[j] = a
c = string[i:]
c.sort()
string = string[:i]+c
return string
迭代函数注意要将输入的字符串先转换为list数据类型,再进行处理,最终再转化为字符串类型
这里列表的排序用 .sort() 方法,列表的字符合并为字符串用 ‘’.join() 方法
def fullpermutation (argument):
string = list(argument)
string.sort()
first = ''.join(string)
buffer = [first]
para = numpy.math.factorial(len(string))
for k in range(para-1):
string = findnext(string)
string1 = ''.join(string)
buffer.append(string1)
print(buffer)
##return buffer
最后调用函数,用12345进行试验
fullpermutation('12345')
以上就是我的第一次markdown实战,嘻嘻嘻