zoukankan      html  css  js  c++  java
  • 全排列——交换法

    为了方便大家理解,我尽量写的浅显易懂,同时希望大家把不理解的发到评论中,我会尽所能,帮助你l理解。

    欢迎qq进行交流问题: 

          本人QQ :1770115451             算法交流群: 1061907071

    题目描述:

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

       例如: “ABC”  的全排列结果为:ABC 、ACB、BAC、BCA、CAB、CBA

      (题意:就是一个字符串的每一个字符重新排列出的所有的结果)

    解题方法:交换法

      原理假设以字符串第0个位置(也就是第一个字符)为起点,分别与后面的每一个位置对应的字符进行交换。直到k等于字符串最后一个位置时,就会排列出新的组合

       说明:交换法涉及到多路递归,和回溯等问题,理解起来有点抽象,具体过步骤和代码已经写在下面,结合图和代码理解,会好理解,不懂的可以评论,我看到一定会解答。

    实现步骤:

      前提:需要将字符串转为字符数组      char arr[]=str.toCharArray();

         第一步:创建一个用于返回结果的res数组

     第二步,当k=chs.length的时候,说明一种排列方式已经交换好了,并将该结果添加到res中(递归的出口) 
     第三步:交换法(一定要回溯)

    关键代码

    //交换法代码(多路递归,回溯)
        
        //第一步:创建一个用于返回结果的res数组
        static ArrayList<String>   res = new  ArrayList<>();
        
        public static void   permutation(char[]arr,int k){ //arr为字符数组,k代表对应的状态
        //第二步,当k=chs.length的时候,说明一种排列方式已经交换好了,并将该结果添加到res中(递归的出口)    
            if(k==arr.length){
                res.add(new String(arr)); //new String()是将字符数组转为字符串数组。
            }
        //第三步:交换法的核心
            //以第k个字符为起点,依次与后面位置的元素进行交换,产生新的组合。
            for(int i=k;i<arr.length;i++){
                swap(arr, k, i);//将k和i对应的字符进行交换
                permutation(arr, k+1);  //交换完成后,继续交换下一个状态的字符,直到k=arr.length
                swap(arr,k,i); //交换完毕后,由于下一次交换是由上一次的状态取决的,所以必须回溯到上一个状态
            }
        }
    //交换数组元素代码
        public static void swap(char[]arr,int i,int j){
            char   temp=arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
  • 相关阅读:
    请简述APP(移动运用)在升级安装时候应该考虑的场景?
    订单怎么测试
    支付功能测试
    购物车测试方法
    Python xlrd模块读取Excel表中的数据
    对h5页面的测试方式
    selenium IDE的使用
    单表王五涨工资操作
    siri功能测试
    逻辑题
  • 原文地址:https://www.cnblogs.com/songchengyu/p/12640126.html
Copyright © 2011-2022 走看看