题目:输入一个字符串,打印出该字符串中字符的所有排列
方法:首先求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。第二步固定第一个字符,求后面所有字符的排列。这个时候会把后面的所有字符分成两部分:后面字符的第一个字符,以及这个字符之后的所有字符。然后把第一个字符逐一和它后面的字符交换。。。
void Permutation(char* pStr){
if (pStr == NULL){
return;
}
Permutation(pStr, pStr);
}
void Permutation(char* pStr, char* pBegin){
if (*pBegin == '\0'){
printf("%s\n", pStr);
}
else {
for (char* pCh = pBegin; *pCh != '\0'; ++pCh){
char temp = *pCh;
*pCh = *pBegin;
*pBegin = temp;
Permutation(pStr, pBegin + 1);
temp = *pCh;
*pCh = *pBegin;
*pBegin = temp;
}
}
}
测试用例:
- 功能测试(输入的字符串中有1个或者多个字符)
- 特殊输入测试(输入的字符串的内容为空或者是NULL指针)
扩展:
- 求所有字符的所有组合
- 把求n个字符组成长度为m的组合的问题分解成两个子问题,分别求n-1个字符串中长度为m-1的组合,以及求n-1个字符的长度为m的组合。
- 输入一个含有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。
- 8皇后问题