题目描述:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cba、和cab。
解题思路:
- 把这个复杂的问题分解成小问题
- 先把一个字符串看成两部分组成:第一部分为它们的第一个字符,第二部分是后面所有的字符。
- 而求整个字符串的排列,可以看成两步:
第一步:求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。
第二步:固定第一个字符,求后面所有字符的排列。这个时候我们仍把后面的所有字符分成两部分:后面字符的第一个字符以及这个字符之后的所有字符。然后把第一个字符逐一和它后面的字符交换。
测试用例:
//测试用例
int main(){
//字符串
char str[4] = "abc";
//全排列,输出
Permutation(str);
return 0;
}
函数实现:
// 函数实现
void Permutation(char *str, char *begin){ //参数一:整个字符串的第一个字符; 参数二:做排列操作的字符串的第一个字符(即固定的字符)
//递归基
if(*begin == '\0')
std::cout << str << "\n";
else{
//交换字符
for(char *pCh = begin; *pCh != '\0'; ++pCh){
char temp = *pCh;
*pCh = *begin;
*begin = temp;
//将所有begin+1的字符全排列
Permutation(str, begin + 1);
//再交换
temp = *pCh;
*pCh = *begin;
*begin = temp;
}
}
}
void Permutation(char *str){
if(str == NULL)
return;
//重载函数
Permutation(str, str);
}