程式設計之法面試和演算法心得-1.3字串的全排列
阿新 • • 發佈:2018-12-19
一、題目描述
輸入一個字串,列印該字串中字元的所有排列。例如輸入字串“abc”,則輸出“a”,“b”,“c”,所能夠排列的所有字串:“abc”,“acb”,“bac”,“bca”,“cab”,“cba”。
二、解法一:遞迴實現
遞迴的實現可以想成從區域性到整體。字串的全排列,最小的區域性就是兩個字元。兩個字元不動輸出一次,在交換輸出一次,得到兩個結果。多個字元的全排列,歸根結底都是兩個字元的移動,因此可以用遞迴的思想。可以固定前面字元,看最後兩個的全排列,然後在最後三個的全排列,依次類推。
具體實現程式碼如下:
def swap(a, b): return b, a def CalcAllPermutation(s, start, end): if(end <= 0): return if(start == end): print (''.join(s)) for i in range(start, end+1): s[start], s[i] = swap(s[start], s[i]) CalcAllPermutation(s, start+1, end) s[start], s[i] = swap(s[start], s[i])
Python不像C/C++有指標,因此swap()要自己定義。for迴圈中的CalcAllPermutation(s, start+1, end)就是固定前邊字元,一層層計算start+1到end的全排列,因此走到底,第一次計算的是最後兩個字元的全排列,再是最後三個字元的全排列,…。
三、課後題
3.1字典序的所有排列
題目描述:已知字串中的字元互不相同,現在把他們任意排列,如輸入為“ab”,則輸出的任意排列為:“aa”,“ab”,“bb”,“ba”。程式設計實現該功能。
**分析:**這個不是簡單的全排列問題,跟全排列的形式有所區別。本題可以採用遞迴的思想,設定一個變數記錄已輸出的字串的長度,達到了輸出的長度就輸出,反之繼續往後輸出字元。
參考程式碼如下:
def CalcAllPermutation(s, s_o, n, m): if(n <= 0): return if(m == n): print (''.join(s_o)) else: for i in range(n): s_o[m] = s[i] CalcAllPermutation(s, s_o, n, m+1) def main(): stra = input("Enter a string:") stra = list(stra) s_o = stra.copy() CalcAllPermutation(stra , s_o, len(stra), 0)
未完待續。。。