題目:輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串
abc,則輸出由字元a、
b、c所能排列出來的所有字串
abc、
acb、
bac、
bca、
cab和
cba。
分析:這是一道很好的考查對遞迴理解的程式設計題,因此在過去一年中頻繁出現在各大公司的面試、筆試題中。
我們以三個字元abc為例來分析一下求字串排列的過程。首先我們固定第乙個字元a,求後面兩個字元bc的排列。當兩個字元bc的排列求好之後,我們把第乙個字元a和後面的b交換,得到bac,接著我們固定第乙個字元b,求後面兩個字元ac的排列。現在是把c放到第一位置的時候了。記住前面我們已經把原先的第乙個字元a和後面的b做了交換,為了保證這次c仍然是和原先處在第一位置的a交換,我們在拿c和第乙個字元交換之前,先要把b和a交換回來。在交換b和a之後,再拿c和處在第一位置的a進行交換,得到cba。我們再次固定第乙個字元c,求後面兩個字元b、a的排列。
既然我們已經知道怎麼求三個字元的排列,那麼固定第乙個字元之後求後面兩個字元的排列,就是典型的遞迴思路了。
基於前面的分析,我們可以得到如下的參考**:
void
permutation(char* pstr, char* pbegin);
/// get the permutation of a string,
// for example, input string abc, its permutation is
// abc acb bac bca cba cab
/void
permutation(char* pstr)
/// print the permutation of a string,
// input: pstr - input string
// pbegin - points to the begin char of string
// which we want to permutate in this recursion
/void
permutation(char* pstr, char* pbegin)
// otherwise, permute string
else}}
擴充套件1:如果不是求字元的所有排列,而是求字元的所有組合,應該怎麼辦呢?當輸入的字串中含有相同的字串時,相同的字元交換位置是不同的排列,但是同乙個組合。舉個例子,如果輸入abc,它的組合有a、b、c、ab、ac、bc、abc。
擴充套件2:輸入乙個含有8個數字的陣列,判斷有沒有可能把這8個數字分別放到正方體的8個頂點上,使得正方體上三組相對的面上的4個頂點的和相等。
程式設計師面試題精選100題 字串的組合 演算法
題目 輸入乙個字串,輸出該字串中字元的所有組合。舉個例子,如果輸入 abc,它的組合有a b c ab ac bc abc。分析 在本系列部落格的第 28題 字串的排列 中,我們詳細討論了如何用遞迴的思路求字串的排列。同樣,本題也可以用遞迴的思路來求字串的組合。假設我們想在長度為 n的字串中求 m個...
程式設計師面試題精選100題
今天開始各種刷面試題,沉下心來集中時間,全身心投入 題目 輸入一棵二元查詢樹,將該二元查詢樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只調整指標的指向。比如將二元查詢樹 10 6 14 4 8 12 16 轉換成雙向鍊錶 4 6 8 10 12 14 16。相關概念 二元查詢樹 它首先要是...
程式設計師面試題精選
問題描述 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a b c所能排列出來的所有字串abc acb bac bca cab和cba。問題分析 這是一道很好的考查對遞迴理解的程式設計題。寫遞迴程式關鍵有兩點,處理好進入與返回的關係,進入時改變了什麼,返回時應當恢復。字...