1. 程式人生 > >程式設計之法面試和演算法心得-1.3字串的全排列

程式設計之法面試和演算法心得-1.3字串的全排列

一、題目描述

輸入一個字串,列印該字串中字元的所有排列。例如輸入字串“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)

未完待續。。。