【剑指offer】:字符串的排列(全排列问题)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/hansionz/article/details/82463055