php实现的生成排列算法示例

这篇文章主要介绍了php实现的生成排列算法,结合实例形式分析了php基于递归、遍历字符串实现全排列相关算法实现技巧,需要的朋友可以参考下。

本文实例讲述了php实现的生成排列算法,分享给大家供大家参考,具体如下:

  1. <?php
  2. function perm($s, $n, $index)
  3. {
  4. if($n == 0)
  5. {
  6. return '';
  7. }
  8. else
  9. {
  10. $nIndex = count($index); //可用的字符串下标
  11. $res = array();
  12. foreach($index as $i => $v)
  13. {
  14. $tmp = $index;
  15. unset($tmp[$i]); //去掉当前的前缀
  16. /* 调试信息,便于理解
  17. echo "len $n , cur $i , index:\n";
  18. var_dump($tmp);
  19. */
  20. $ret = perm($s, $n-1, $tmp); //递归得到稍短的排列
  21. if($ret != '')
  22. {
  23. foreach($ret as $r)
  24. {
  25. $res[] = $s[$v] . $r; //将稍短的排列逐个拼上当前的前缀
  26. }
  27. }
  28. else
  29. {
  30. $res[] = $s[$v];
  31. }
  32. }
  33. return $res;
  34. }
  35. }
  36. function getPerm($s)
  37. {
  38. $n = strlen($s);
  39. $index = range(0, $n-1);
  40. //得到不同长度的排列
  41. for($i=1; $i<=$n; $i++)
  42. {
  43. var_dump(perm($s, $i, $index));
  44. }
  45. }
  46. getPerm('abcd');
  47. ?>

运行结果:

  1. array(4) {
  2. [0]=>
  3. string(1) "a"
  4. [1]=>
  5. string(1) "b"
  6. [2]=>
  7. string(1) "c"
  8. [3]=>
  9. string(1) "d"
  10. }
  11. array(12) {
  12. [0]=>
  13. string(2) "ab"
  14. [1]=>
  15. string(2) "ac"
  16. [2]=>
  17. string(2) "ad"
  18. [3]=>
  19. string(2) "ba"
  20. [4]=>
  21. string(2) "bc"
  22. [5]=>
  23. string(2) "bd"
  24. [6]=>
  25. string(2) "ca"
  26. [7]=>
  27. string(2) "cb"
  28. [8]=>
  29. string(2) "cd"
  30. [9]=>
  31. string(2) "da"
  32. [10]=>
  33. string(2) "db"
  34. [11]=>
  35. string(2) "dc"
  36. }
  37. array(24) {
  38. [0]=>
  39. string(3) "abc"
  40. [1]=>
  41. string(3) "abd"
  42. [2]=>
  43. string(3) "acb"
  44. [3]=>
  45. string(3) "acd"
  46. [4]=>
  47. string(3) "adb"
  48. [5]=>
  49. string(3) "adc"
  50. [6]=>
  51. string(3) "bac"
  52. [7]=>
  53. string(3) "bad"
  54. [8]=>
  55. string(3) "bca"
  56. [9]=>
  57. string(3) "bcd"
  58. [10]=>
  59. string(3) "bda"
  60. [11]=>
  61. string(3) "bdc"
  62. [12]=>
  63. string(3) "cab"
  64. [13]=>
  65. string(3) "cad"
  66. [14]=>
  67. string(3) "cba"
  68. [15]=>
  69. string(3) "cbd"
  70. [16]=>
  71. string(3) "cda"
  72. [17]=>
  73. string(3) "cdb"
  74. [18]=>
  75. string(3) "dab"
  76. [19]=>
  77. string(3) "dac"
  78. [20]=>
  79. string(3) "dba"
  80. [21]=>
  81. string(3) "dbc"
  82. [22]=>
  83. string(3) "dca"
  84. [23]=>
  85. string(3) "dcb"
  86. }
  87. array(24) {
  88. [0]=>
  89. string(4) "abcd"
  90. [1]=>
  91. string(4) "abdc"
  92. [2]=>
  93. string(4) "acbd"
  94. [3]=>
  95. string(4) "acdb"
  96. [4]=>
  97. string(4) "adbc"
  98. [5]=>
  99. string(4) "adcb"
  100. [6]=>
  101. string(4) "bacd"
  102. [7]=>
  103. string(4) "badc"
  104. [8]=>
  105. string(4) "bcad"
  106. [9]=>
  107. string(4) "bcda"
  108. [10]=>
  109. string(4) "bdac"
  110. [11]=>
  111. string(4) "bdca"
  112. [12]=>
  113. string(4) "cabd"
  114. [13]=>
  115. string(4) "cadb"
  116. [14]=>
  117. string(4) "cbad"
  118. [15]=>
  119. string(4) "cbda"
  120. [16]=>
  121. string(4) "cdab"
  122. [17]=>
  123. string(4) "cdba"
  124. [18]=>
  125. string(4) "dabc"
  126. [19]=>
  127. string(4) "dacb"
  128. [20]=>
  129. string(4) "dbac"
  130. [21]=>
  131. string(4) "dbca"
  132. [22]=>
  133. string(4) "dcab"
  134. [23]=>
  135. string(4) "dcba"
  136. }