当前位置:   article > 正文

全排列顺序输出【c语言】【按字母序】【有序全排列】_输出全排列

输出全排列

题目

给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。

我们假设对于小写字母有‘a’ <‘b’ < ... <‘y’<‘z’,而且给定的字符串中的字母已经按照从小到大的顺序排列。

输入说明

只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。

输出说明

输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。

输入样例

abc

输出样例

abc

acb

bac

bca

cab

cba

解题思路

采用递归法,n为字符串长度,每次递归将位置x的字母依次和位置x+1,x+2……n-1的字母调换顺序(swap函数),完成一次调换后,将调换后的字符串传入下一层x+1的递归,实际上进行了像蓝线那样的分割,将蓝线后面的那个字符(位置x)依次和后面的字符调序,最后x递归到n-1层级,进行输出。这里注意,需要将每次递归第一次调序的字符串(橙色字符串)进行暂存,并在最后一次调序后已经传入下次递归的字符串修改为暂存的字符串,这个字符串就会返回至上层递归,以便上层递归正确进行每次调序,这一步很重要,很多的解题方法直接粗暴的把调序完的字符串传入下层递归后就再次调序(即恢复原来的顺序),这样做会导致上一层递归调序混乱,使得输出的字符串并不是字母序比较小的排列在前面。(如图二对比)

解题代码

  1. #include<stdio.h>//顺序输出全排列
  2. #include<string.h>
  3. #include<stdlib.h>
  4. void swap(char* a, char* b);
  5. void creat(int x, int n, char* p);
  6. void copy(char* a, char* b, int size);
  7. int main()
  8. {
  9. char* p;
  10. p = (char*)malloc(10000);
  11. scanf("%s", p);
  12. printf("\n");
  13. creat(0, strlen(p), p);
  14. return 0;
  15. }
  16. void creat(int x, int n, char* p)
  17. {
  18. int i; char* temp; temp = (char*)malloc(10000);
  19. if (x == n-1)
  20. {
  21. for (i = 0;i < n;i++)
  22. printf("%c", *(p + i));
  23. printf("\n");
  24. }
  25. else
  26. {
  27. for (i = x; i < n; i++)
  28. {
  29. if (i == x)
  30. {
  31. copy(temp, p, n);
  32. }
  33. swap(p + i, p + x);
  34. creat(x + 1, n, p);
  35. if (i == n-1)
  36. {
  37. copy(p, temp, n);
  38. }
  39. }
  40. }
  41. }
  42. void swap(char* a, char* b)//交换
  43. {
  44. char temp;
  45. temp = *a;
  46. *a = *b;
  47. *b = temp;
  48. }
  49. void copy(char* a, char* b, int size)//拷贝字符串b到a
  50. {
  51. int i;
  52. for (i = 0; i < size; i++)
  53. {
  54. *(a + i) = *(b + i);
  55. }
  56. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/651114
推荐阅读
相关标签
  

闽ICP备14008679号