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 ArrayListPermutation(String str) {12 List 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 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 }