歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C語言求字母的全部組合

C語言求字母的全部組合

日期:2017/3/1 10:07:08   编辑:Linux編程

使用的遞歸的方法:既然是組合,則順序不要求順序了。

主要原理就是從第一個字符開始,分兩種情況:1.留下此字符;2.去除此字符。 再對剩下的字符求組合。

然後再第二個字符,分兩種情況,再對剩下的字符求組合

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. template <typename T>
  5. inlinevoid swap(T &a , T &b)
  6. {
  7. T tmp;
  8. tmp = a;
  9. a = b;
  10. b = tmp;
  11. }
  12. void doPrintAllCombination(char *str , int begin , int end)
  13. {
  14. if(begin == end) {
  15. char tmp;
  16. if(end != 0) { //i要此字符時
  17. tmp = str[end];
  18. str[end] = '\0';
  19. printf("%s\n",str);
  20. str[end] = tmp;
  21. }
  22. tmp = str[end+1]; //不要此字符
  23. str[end+1] = '\0';
  24. printf("%s\n" , str);
  25. str[end+1] = tmp;
  26. return;
  27. }
  28. //第二種情況,去除此字符
  29. swap(str[begin],str[end]);
  30. doPrintAllCombination(str , begin , end-1);
  31. swap(str[begin] , str[end]);
  32. //第一種情況,留下此字符
  33. doPrintAllCombination(str , begin+1 , end);
  34. }
  35. void printAllCombination(char *str)
  36. {
  37. doPrintAllCombination(str , 0 , strlen(str)-1);
  38. }
  39. int main(int argc , char *argv[])
  40. {
  41. if(argc != 2) {
  42. printf("usage: %s <string>\n" , argv[0]);
  43. return -1;
  44. }
  45. char *str = (char*)malloc(strlen(argv[1]) + 1);
  46. strcpy(str , argv[1]);
  47. printf("orignate string : %s\n" , str);
  48. printAllCombination(str);
  49. free(str);
  50. return 0;
  51. }

結果:

orignate string : abc
b
c
cb
a
ac
ab
abc

結果中有些字符的順序改變了,如cb ,,按正常順序可能是bc,,,

這是因為我的這個程序的空間復雜度為O(1)

如果你要求產生的組合與原始字符的順序一致,,則可以使用mask代替,,標記使用不使用此字符。此時空間復雜度為O(N)

反正時間復雜度都為O(N)

Copyright © Linux教程網 All Rights Reserved