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)