題目描述:
輸入乙個字串,列印出該字串中字元的所有排列。
基本思路:
從字串中選出乙個字元作為排列的第乙個字元,然後對剩餘的字元進行全排列,如此遞迴,從而得到所有字元的全排列。以對字元」abc」進行全排列為例,可以按下述步驟執行:
將a固定在第一位,求後面bc的排列
將b固定在第一位,求後面ac的排列
將c固定在第一位,求後面ab的排列
#include執行結果(centos5.5)#include
#define swap(t,x,y) (t = (x),x = (y),y = (t))
void calcallpermutation(char *perm,int
from,int to)
else
}} int main()
[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執行結果如下:(centos5.5)#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)
[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種情況.全排列的過程 選擇第乙個字元 獲得第乙個字元固定下...