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 ...