字串的全排列與組合

2021-07-15 07:49:46 字數 1835 閱讀 2174

題目描述:

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

基本思路:

從字串中選出乙個字元作為排列的第乙個字元,然後對剩餘的字元進行全排列,如此遞迴,從而得到所有字元的全排列。以對字元」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 待排列的字串的起始位置,遞迴...