对一个字符串实现字符串的全排列
def swap(arr,i,j):
arr[i],arr[j]=arr[j],arr[i]
def quanpailie(arr,start,record=[]):
if start==len(arr)-1:
record.append(''.join(arr))
return
else:
i=start
#从start开始每次都对i到start进行交换,这样相当于固定了列表的一个元素,交换只是对后面的
#替换开头的元素而已
while i<len(arr):
swap(arr,start,i)
quanpailie(arr,start+1,record)
swap(arr,start,i)
i+=1
return record
arr=['1','2','3']
record=[]
record=quanpailie(arr,0,record)
record.sort()
print(record)
#['123', '132', '213', '231', '312', '321']
'''
改进方法1:
我们发现如果这个字符串之间没有重复还好,一旦重复的话会产生很多重复的字符串
如
'''
arr=['1','2','3','2']
record=[]
record=quanpailie(arr,0,record)
record.sort()
print(record)
'''
结果
['1223', '1223', '1232', '1232', '1322', '1322',
'2123', '2123', '2132', '2132', '2213', '2213', '2231',
'2231', '2312', '2312', '2321', '2321', '3122', '3122',
'3212', '3212', '3221', '3221']
'''
'''
这是因为我们不管后面的数是否会和交换的数一样都进行了交换,为此我们需要进行一个去重的函数
'''
def swap(arr,i,j):
arr[i],arr[j]=arr[j],arr[i]
def duplicated(arr,i,j):
while i<j:
if arr[i]==arr[j]:
#print(i,j)
return True
i+=1
return False
#这个函数的意思是[1,2,3,2] 比如我要交换第4个位置,但第二个位置也有2,所有在第四个位置之前
#已经对第二个位置交换过,所以不用再对第4个位置交换了,我要从第i到j个位置会不会有重复
#duplicated(arr,0,3)
#duplicated(arr,1,3)
def quanpailie_up(arr,start,record):
#record 记录全排列
if start==len(arr)-1:#如果是对最后一个字母进行全排列证明全排列完成了
return record.append(''.join(arr))
else:
i=start
while i<len(arr):
if duplicated(arr,start,i)==False:
swap(arr,start,i)
quanpailie_up(arr,start+1,record)
#前面打乱了顺序,后面必须将其归为原来的位置以后再进行全排
swap(arr,start,i)
i+=1
else: #如果存在重复代表之前已经求过全排列了,寻找下一个需要交换的元素
i+=1
return record
arr=['1','2','3','2']
record=[]
result=quanpailie_up(arr,0,record)
result.sort()
print(result)
#结果
'''
['1223', '1232', '1322', '2123', '2132', '2213', '2231', '2312', '2321', '3122', '3212', '3221']
'''