php实现字符串的排列(交换)(递归考虑所有情况)
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 }
版权申明:欢迎转载,但请注明出处
一些博文中有一些参考内容因时间久远找不到来源了没有注明,如果侵权请联系我删除。
在校每年国奖、每年专业第一,加拿大留学,先后工作于华东师范大学和香港教育大学。
2024-10-30:27岁,宅加太忙,特此在网上找女朋友,坐标上海,非诚勿扰,vx:fan404006308
AI交流资料群:753014672