劍指Offer 字串的排列

2021-10-07 12:55:08 字數 3409 閱讀 8407

2. 題目 2

3. 題目 3

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

輸入:

abc
輸出:

abc

acbbac

bcacba

cab

可以把乙個字串看成由兩部分組成:第一部分是它的第乙個字元;第二部分是後面的所有字元。求整個字串的排列,可以看成兩步。

1.求所有可能出現在第乙個位置的字元。

2.固定第乙個字元,求後面所有字元的排列。這時仍把後面所有字元分成兩部分:後面字元的第乙個字元,以及這個字元之後的所有字元。

#include

void

permutation

(char

* string,

char

* strbegin)

;void

permutation

(char

* string)

permutation

(string, string);}

void

swap

(char

* stra,

char

* strb)

void

permutation

(char

* string,

char

* strbegin)

else

swap

(strch, strbegin)

;permutation

(string, strbegin +1)

;swap

(strch, strbegin);}

}}intmain

(void

)

如果不是求字元的所有排列,而是求字元的所有組合,應該怎麼辦呢?還是輸入三個字元 a、b、c,則它們的組合有 a、b、c、ab、ac、bc、abc。當交換字串中的兩個字元時,雖然能得到兩個不同的排列,但卻是同乙個組合。比如 ab 和 ba 是不同的排列,但只算乙個組合。

輸入:

abc
輸出:

abc

abac

bcabc

可以把這 n 個字元分成兩部分:第乙個字元和其餘的所有字元。如果組合裡包含第乙個字元,則下一步在剩餘的字元裡選取 m-1個字 符:如果組合裡不包含第乙個字元,則下一步在剩餘的 n-1 個字元裡選取 m 個字元。也就是說,我們可以把求 n 個字元組成長度為 m 的組合的問題分解成兩個子問題。

1.求 n-1 個字串中長度為 m-1 的組合。

2.求 n-1 個字元的長度為 m 的組合。

#include

#include

#include

void

combination

(char

* string,

int number, std:

:vector<

char

>

& result)

;void

combination

(char

* string)

std:

:vector<

char

> result;

for(

int i =

1; i <=

strlen

(string)

;++i)

}void

combination

(char

* string,

int number, std:

:vector<

char

>

& result)

printf

("\n");

return;}

if(*string ==

'\0'

) result.

push_back

(*string)

;combination

(string +

1, number -

1, result)

; result.

pop_back()

;combination

(string +

1, number, result);}

intmain

(void

)

輸入乙個含有 8 個數字的陣列,判斷有沒有可能把這8個數字分別放到正方體的8個頂點上,使得正方體上三組相對的面上的4個頂點的和都相等。

相當於先得到a1、a2、a3、a4、a5、a6、a7和a8這 8 個數字的排列,然後判斷有沒有某乙個排列符合題目給定的條件,即 a1+a2+a3+a4 == a5+a6+a7+a8,a1+a3+a5+a7 == a2+a4+a6+a8,並且a1+a2+a5+a6 == a3+a4+a7+a8。

#include

#include

void

swap

(int

* a,

int*b)

bool cubvertex

(int

* a,

int length,

int begin)

bool result = false;

int i =0;

if(begin == length -1)

printf

("\n");

result = true;}}

else

swap

(&a[begin]

,&a[i]);

}}return result;

}int

main

(void);

int b[8]

=;if(

cubvertex

(a,8,0

))elseif(

cubvertex

(b,8,0

))else

return0;

}/* 執行結果

* 1 2 3 2 3 2 1 2

* yes!

* no!

*/

個人部落格:

www.codeapes.cn

劍指Offer 字串排列

題目描述 輸入乙個字串,列印出該字串中字元的所有排列。解析 step 1 求所有可能出現第乙個位置的字元。把第乙個字元與後面的每個字元交換。step 2 固定第乙個字元,將後面的字元利用遞迴進行全排列。include include using namespace std void stringpe...

劍指offer 字串的排列

題目描述 輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c 所能排列出來的所有字串abc,acb,bac,bca,cab和cba。結果請按字母順序輸出。解題思路 深度搜尋,在每層搜尋裡設定乙個a陣列對映所有字元,每個字元在這層迴圈中只能使用一次,避免重...

劍指offer 字串的排列

輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。結果請按字母順序輸出。輸入描述 輸入乙個字串,長度不超過9 可能有字元重複 字元只包括大小寫字母。分析 經典問題。記住吧。class ...