为了方便大家理解,我尽量写的浅显易懂,同时希望大家把不理解的发到评论中,我会尽所能,帮助你l理解。
欢迎qq进行交流问题:
本人QQ :1770115451 算法交流群: 1061907071
题目描述:
请编写一个方法,确定某字符串所有的排列组合,给定一个字符串,请返回该字符串的所有排列
例如: “ABC” 的全排列结果为:ABC 、ACB、BAC、BCA、CAB、CBA
(题意:就是一个字符串的每一个字符重新排列出的所有的结果)
解题方法:插空法(迭代形式)
原理:依次取字符串的每一个字符,并对上一次的结果进行插空,当取到最后一个字符的时候,返回该结果。
实现思路:
注意:由于输出的是排列的结果,用数组的话无法确定数组的长度,所以考虑用String类型的集合来存储 输出的结果。
第一步:先创建一个集合,用来装所有排列的结果。
第二步:初始化集合,先给集合添加str的第一个字符,用于后面迭代的过程插空
第三步:以str第二个字符为新字符,分别插空到前面生成的集合里取。
第四步:再创建一个新的集合,用来 装 新字符插入不同位置的所有结果
第五步:获取新字符
第六步:访问上一个集合,并向新的集合分别从不同的位置插入。
第七步:插入完毕后更新list。并返回。
具体代码:
//插空法迭代形式代码: public static ArrayList<String> permutation (String str,int len){ //str:要排列的字符串 cur:递归状态 //第一步:创建一个集合,用来装所有排列后的结果 ArrayList<String> list= new ArrayList<>(); //第二步:初始化集合,给集合添加str第一个字符,用于后面迭代过程中的插空 ( 不然,连字符都没有,往哪插空?) list.add(str.charAt(0)+""); //由于str.charAt(0)是字符,所以必须转为字符串 //第三步:以 str 第2个字符为新字符,分别插空到前面生成集合的每一个元素中 for(int i=1;i<len;i++){ //注意:i是str的下标 //第四步:再创建一个新的集合,用来 装 新字符插入不同位置的结果 ArrayList<String> list_new =new ArrayList<>(); //第五步:获取新字符 char c=str.charAt(i); //第六步:访问上一次的集合,并向新的集合分别从不同的位置插入 for(String s:list){ String newStr =c+s; //新字符插在左边,并添加到新集合中 list_new.add(newStr); newStr = s+c; //新字符插在右边,并添加到新集合中 list_new.add(newStr); //插在中间 for(int j=1;j<s.length();j++){ //从s中间的第一个空开始插入 newStr=s.substring(0,j) + c + s.substring(j); list_new.add(newStr); } } //第七步:插入完毕后,更新list list=list_new; } return list; }