字串的排列組合問題

2021-06-06 05:28:46 字數 2595 閱讀 1837

**:

問題1 :輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a、b、c所能排列出來的所有字串abc、acb、bac、bca、cab和cba。

思路:這是個遞迴求解的問題。遞迴演算法有四個特性:(1)必須有可達到的終止條件,否則程式將陷入死迴圈;(2)子問題在規模上比原問題小;(3)子問題可通過再次遞迴呼叫求解;(4)子問題的解應能組合成整個問題的解。

對於字串的排列問題。如果能生成n - 1個元素的全排列,就能生成n個元素的全排列。對於只有1個元素的集合,可以直接生成全排列。全排列的遞迴終止條件很明確,只有1個元素時。下面這個圖很清楚的給出了遞迴的過程。

參考**:解法1通過permutation_solution1(str, 0, n); 解法2通過呼叫permutation_solution2(str, str)來求解問題。

[cpp]view plain

copy

print?

//函式功能 : 求乙個字串某個區間內字元的全排列

//函式引數 : pstr為字串,begin和end表示區間

//返回值 :   無

void

permutation_solution1(

char

*pstr, 

intbegin, 

intend)  

else

}  }  //函式功能 : 求乙個字串某個區間內字元的全排列

//函式引數 : pstr為字串,pbegin為開始位置

//返回值 :   無

void

permutation_solution2(

char

*pstr, 

char

*pbegin)  

else

}  }  //提供的公共介面

void

permutation(

char

*pstr)    

問題2:輸入乙個字串,輸出該字串中字元的所有組合。舉個例子,如果輸入

abc,它的組合有a、b、c、ab、ac、bc、abc。

思路:同樣是用遞迴求解。可以考慮求長度為n的字串中m個字元的組合,設為c

(n,m)

。原問題的解即為c(n, 1), c(n, 2),...c(n, n)的總和。對於求c(n, m),從第乙個字元開始掃瞄,每個字元有兩種情況,要麼被選中,要麼不被選中,如果被選中,遞迴求解c(n-1, m-1)。如果未被選中,遞迴求解c(n-1, m)。不管哪種方式,n的值都會減少,遞迴的終止條件n=0或m=0。

[cpp]view plain

copy

print?

//函式功能 : 從乙個字串中選m個元素

//函式引數 : pstr為字串, m為選的元素個數, result為選中的

//返回值 :   無

void

combination_m(

char

*pstr, 

intm, vector<

char

> &result)  

//選擇這個元素

result.push_back(*pstr);  

combination_m(pstr + 1, m - 1, result);  

result.pop_back();  

//不選擇這個元素

combination_m(pstr + 1, m, result);  

}  //函式功能 : 求乙個字串的組合

//函式引數 : pstr為字串

//返回值 :   無

void

combination(

char

*pstr)  

}  問題3:打靶問題。乙個射擊運動員打靶,靶一共有10環,連開10 槍打中90環的可能性有多少?

思路:這道題的思路與字串的組合很像,用遞迴解決。一次射擊有11種可能,命中1環至10環,或脫靶。

參考**:

[cpp]view plain

copy

print?

//函式功能 : 求解number次打中sum環的種數

//函式引數 : number為打靶次數,sum為需要命中的環數,result用來儲存中間結果,total記錄種數 

//返回值 :   無

void

shootproblem_solution1(

intnumber, 

intsum, vector<

int> &result, 

int*total)  

else

return

;  }  

for(unsigned i = 0; i <= 10; i++) 

//命中0-10環

}  //提供的公共介面

void

shootproblem(

intnumber, 

intsum)  

字串排列組合問題

一.全排列無重複字元 include include char buf 1024 void func int index void swap int index1,int index2 intmain void func int index else void swap int index1,int...

字串的排列組合問題

本文 問題1 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a b c所能排列出來的所有字串abc acb bac bca cab和cba。思路 這是個遞迴求解的問題。遞迴演算法有四個特性 1 必須有可達到的終止條件,否則程式將陷入死迴圈 2 子問題在規模上比原問題小 ...

字串的排列組合問題

題目 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a b c所能排列出來的所有字串abc acb bac bca cab和cba。分析 這是一道很好的考查對遞迴理解的程式設計題,因此在過去一年中頻繁出現在各大公司的面試 筆試題中。我們以三個字元abc為例來分析一下求字...