版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hansionz/article/details/82463055
0.题目
输入一个字符串,打印出该字符串中字符所有的排。例如:输入
abc
,屏幕需要打印出来abc、acb、bac、bca、cab、cba
.
1.解题思路
- 首先我们固定a,求出bc的全排列,而bc的全排列bc、cb。而求bc的全排列是一个子问题,可以先固定b,求c的全排列,然后在交换继续求解。
- 然后交换a和b得到bac,固定b,求ac的全排列,和1的求法一样。
- 然后交换a和c,但是在交换a和c之前必须将上一步交换的a和b交换过来才能继续交换,得到cba,固定c,求ba的全排列。
2.代码实现
#include<stdio.h>
//交换两个变量的值
void Swap(char* s1, char* s2)
{
char tmp = *s1;
*s1 = *s2;
*s2 = tmp;
}
//全排列
void CompleteSort(char str[],char* begin)
{
if (*begin == '\0')
{
printf("%s\n", str);
}
else
{
//cur指针负责遍历所有字母,与第一个字母交换
for (char* cur = begin; (*cur) != '\0'; cur++)
{
//1.交换两个值(abc->abc,bac,cba)
Swap(&(*cur), &(*begin));
//2.把后边的字母当做为一个子问题递归处理
CompleteSort(str, begin + 1);
//3.因为在第一步已经把两个字母交换过了,现在要交换过来才能继续
Swap(&(*cur), &(*begin));
}
}
}
void Permutation(char* str)
{
if (str == NULL)
{
return;
}
CompleteSort(str, str);
}
int main()
{
char str[] = "abc";
Permutation(str);
return 0;
}