php實現字符串的排列(交換)(遞歸考慮所有情況)
一、總結
交換: 當有abc的時候,分別拿第一位和其它位交換,第一位固定,余下的位做遞歸,這樣有考慮到所有情況,因為第一位只可能是所有的字母,那第一位依次和所有的位交換可以保證所有的位都可以出現在第一位,如果交換的時候要交換的字母和第一位字母相同,則不必交換。
二、php實現字符串的排列
題目描述
輸入一個字符串,按字典序打印出該字符串中字符的所有排列。例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的所有字符串abc,acb,bac,bca,cab和cba。
輸入描述:
輸入一個字符串,長度不超過9(可能有字符重復),字符只包括大小寫字母。
三、代碼
如果字母不重復的話直接回溯解排列組合很好做
字母重復的話:可以交換字母的位置來得到所有情況
基於回溯法思想:當有abc的時候,分別拿第一位和其它位交換,第一位固定,余下的位做遞歸,這樣有考慮到所有情況,因為第一位只可能是所有的字母,那第一位依次和所有的位交換可以保證所有的位都可以出現在第一位,如果交換的時候要交換的字母和第一位字母相同,則不必交換。
代碼一:java
1 import java.util.List; 2 import java.util.Collections; 3 import java.util.ArrayList; 4 5 public class Solution { 6 public static void main(String[] args) { 7 Solution p = new Solution(); 8 System.out.println(p.Permutation("abc").toString()); 9 } 10 11 public ArrayList<String> Permutation(String str) { 12 List<String> res = new ArrayList<>(); 13 if (str != null && str.length() > 0) { 14 PermutationHelper(str.toCharArray(), 0, res); 15 Collections.sort(res); 16 } 17 return (ArrayList)res; 18 } 19 20 public void PermutationHelper(char[] cs, int i, List<String> list) { 21 if (i == cs.length - 1) { 22 String val = String.valueOf(cs); 23 if (!list.contains(val)) 24 list.add(val); 25 } else { 26 for (int j = i; j < cs.length; j++) { 27 swap(cs, i, j); 28 PermutationHelper(cs, i+1, list); 29 swap(cs, i, j); 30 } 31 } 32 } 33 34 public void swap(char[] cs, int i, int j) { 35 char temp = cs[i]; 36 cs[i] = cs[j]; 37 cs[j] = temp; 38 } 39 }