全排列问题——迭代插空法

题目描述:

  请编写一个方法,确定某字符串所有的排列组合,给定一个字符串,请返回该字符串的所有排列

   例如: “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;
    }

猜你喜欢

转载自www.cnblogs.com/songchengyu/p/12593932.html