• 全排列问题——插空法(迭代形式)


    为了方便大家理解,我尽量写的浅显易懂,同时希望大家把不理解的发到评论中,我会尽所能,帮助你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;
        }
  • 相关阅读:
    java算法---五家共井
    JAVA实用工具--javamail
    java基础篇---HTTP协议
    java基础解疑!!!
    java基础解疑!!
    jsp----标签编程(JSTL)
    jsp----EL表达式
    java基础篇---线程问题
    算法篇---java经典问题!!!
    java基础篇---注解(Annotation)
  • 原文地址:https://www.cnblogs.com/songchengyu/p/12593932.html
Copyright © 2020-2023  润新知