算法练习题(1):对字符串进行全排列(知识点:递归)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_41611045/article/details/102697374

对一个字符串实现字符串的全排列

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']
'''

猜你喜欢

转载自blog.csdn.net/weixin_41611045/article/details/102697374