为了方便大家理解,我尽量写的浅显易懂,同时希望大家把不理解的发到评论中,我会尽所能,帮助你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; }