python實現全組合與全排列

python全組合與全排列

一、全排列

1.題目描述

輸入一個字符串,按字典序打印出該字符串中字符的所有排列。例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的所有字符串abc,acb,bac,bca,cab和cba。

2.做題思路

遞歸+回溯

第一步

確定第一個位置的字符,第一個位置與後邊的所有字符進行交換(包括該字符本身)。
如下圖:A與A,B,C進行交換

第二步

對除了第一個位置的後邊所有位置的字符進行相同處理;

結束條件:a)剩下一個字符;b)沒有剩餘字符。兩種選擇都可以獲得正確答案。

簡單來說,它的思想即爲,確定第1位,對n-1位進行全排列,確定第二位,對n-2位進行全排列。

思維導圖

在這裏插入圖片描述

3.代碼

from copy import deepcopy
def permutations(arr, position, end):
    if position == end:
#    if position == end-1:
        h.append(deepcopy(arr))
 
    else:
        for index in range(position, end):
            arr[index], arr[position] = arr[position], arr[index]

            permutations(arr, position+1, end)
            arr[index], arr[position] = arr[position], arr[index]
global h
h  = []
arr = ["a","b","c"]
permutations(arr, 0, len(arr))
print(h)

4.結果

在這裏插入圖片描述

5.字符串有重複字符

上述代碼是針對字符串無重複字符的情況,若有重複字符則在交換數據時,先查詢區間內(兩個交換字符的區間)是否有重複字符,如果有則跳過。

二、全組合

1.題目描述

字符串“abc”的字符組合

產生的順序爲: a、b、c、ab、ac、bc、abc

2.做題思路

利用遞歸的特性確定字符生成的順序組合的問題,跟求排列的問題類似,很容易的想到遞歸的實現方式。比如在一個長度爲n的字符串中選擇m個字符,對於第一個字符有兩種選擇,選或者不選。

a)選擇長度爲n的字符串中的第一個字符,那麼要在其餘的長度n-1的字符串中選擇m-1個字符

b)第二是不選擇長度爲n的字符串中的第一個字符,那麼要在其餘的長度n-1的字符串中選擇m個字符

結束條件

a)已經找到了m個字符,即當m==0時結束;b)當剩餘字符串的長度小於m時,結束遞歸。

3.代碼

# 全組合
from copy import deepcopy
def per(arr, start, num,res):
    if num == 0:
        h.append(deepcopy(res))
        return 
    if len(arr)-start<num:
        return 
    else:
        res.append(arr[start])
        per(arr, start+1, num-1,res)
        temp=res.pop()
        per(arr, start+1, num,res)
global h
h  = []
arr = ["a","b","c"]
start = 0
resul= []
for i in range(1,len(arr)+1):
    per(arr,0, i,resul)
print(h)

4.結果

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章