字串的排列組合

2021-08-05 19:11:09 字數 1830 閱讀 3953

題目描述: 

輸入乙個字串,列印出該字串中字元的所有排列。 

基本思路: 

從字串中選出乙個字元作為排列的第乙個字元,然後對剩餘的字元進行全排列,如此遞迴,從而得到所有字元的全排列。以對字元」abc」進行全排列為例,可以按下述步驟執行: 

將a固定在第一位,求後面bc的排列 

將b固定在第一位,求後面ac的排列 

將c固定在第一位,求後面ab的排列

#include

#include

#define swap(t,x,y) (t = (x),x = (y),y = (t))

void calcallpermutation(char *perm,int

from,int to)

else

}} int main()

執行結果(centos5.5) 

[root@localhost ~]# ./a.out 

abcd 

abdc 

acbd 

acdb 

adcb 

adbc 

bacd 

badc 

bcad 

bcda 

bdca 

bdac 

cbad 

cbda 

cabd 

cadb 

cdab 

cdba 

dbca 

dbac 

dcba 

dcab 

dacb 

dabc 

題目:輸入乙個字串,輸出該字串中字元的所有組合。舉個例子,如果輸入abc,它的組合有a、b、c、ab、ac、bc、abc。 

上面我們詳細討論了如何用遞迴的思路求字串的排列。同樣,本題也可以用遞迴的思路來求字串的組合。

假設我們想在長度為n的字串中求m個字元的組合。我們先從頭掃瞄字串的第乙個字元。針對第乙個字元,我們有兩種選擇:第一是把這個字元放到組合中去,接下來我們需要在剩下的n-1個字元中選取m-1個字元;第二是不把這個字元放到組合中去,接下來我們需要在剩下的n-1個字元中選擇m個字元。這兩種選擇都很容易用遞迴實現。下面是這種思路的參考**:

#include

#include

#include

using

namespace

std; #include

void combination(char *string ,int number,vector

&result); void combination(char *string)

void combination(char *string ,int number , vector

&result)

if(*string == '\0') return ;

result.push_back(*string);

combination(string + 1 , number - 1 , result);

result.pop_back();

combination(string + 1 , number , result);

} int main(void)

執行結果如下:(centos5.5) 

[root@localhost ~]# ./a.out 

第1個組合 a 

第2個組合 b 

第3個組合 c 

第4個組合 ab 

第5個組合 ac 

第6個組合 bc 

第7個組合 abc

0

給主人留下些什麼吧!~~

字串排列組合

題目描述 輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。題目分析 考慮把這個複雜的問題分解成為小的問題。整個字串的排列,可以看成兩個部分 首先,求所有可能出現在第乙個位置的字元 然...

字串排列組合

1 字串的組合 子串行 題目 輸入乙個字串,輸出該字串中字元的所有組合。例子 輸入 abc,它的組合有 a b c ab ac bc abc 分析 我們可以將字串中的每個字元看成二叉樹的乙個節點,根節點為空,每個節點都會有兩種選擇 要 和 不要 兩種選擇 那麼我們就可以利用遞迴實現。public c...

字串的排列 組合

遞迴方法 1 全排列 面試題28 字串的排列 從集合依次選出每乙個元素,作為排列的第乙個元素,然後對剩餘的元素進行全排列,如此遞迴處理 n個數的全排列,一共有n!種情況.n個位置,第乙個位置有n種,當第乙個位置固定下來之後,第二個位置有n 1種情況.全排列的過程 選擇第乙個字元 獲得第乙個字元固定下...