題目描述:
輸入乙個字串,列印出該字串中字元的所有排列。
基本思路:
從字串中選出乙個字元作為排列的第乙個字元,然後對剩餘的字元進行全排列,如此遞迴,從而得到所有字元的全排列。以對字元」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
字串的全排列與組合
一 字串的排列 問題描述 給出乙個字串,請設計乙個函式輸出所有可能的排列,如abc,可能的排列順序有abc acb bac bca cba cab 問題分析 要對長度為n的序列進行排序,可以轉化為固定第乙個的值,再對剩餘的n 1個進行排序的問題,可以用遞迴實現。由於第乙個的值可以是任何乙個,可用第乙...
字串的全排列與組合
一 字串的排列 問題描寫敘述 給出乙個字串。請設計乙個函式輸出全部可能的排列。如abc,可能的排列順序有abc acb bac bca cba cab 問題分析 要對長度為n的序列進行排序,能夠轉化為固定第乙個的值,再對剩餘的n 1個進行排序的問題。能夠用遞迴實現。因為第乙個的值能夠是不論什麼乙個。...
字串排列與組合
一 字串的排列 給定乙個字串,如何求出字串的所有排列。解題思路 字串的排列可以拆分成,第乙個字元和後面的字元進行組合而成,只需要變換第乙個字元,然後遞迴求後面的字元的排列即可,等到後面的字元為空的時候就得到一種字元的排列,下面是 實現 str 要排列的字串 pbegin 待排列的字串的起始位置,遞迴...