27.字符串的排列
题目描述(全排列)
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
题目解答
递归
import java.util.ArrayList; import java.util.List; import java.util.Collections; public class Solution { public ArrayList<String> Permutation(String str) { List<String> res=new ArrayList<>(); if(str!=null && str.length()>0){ PermutationHelper(str.toCharArray(),0,res); Collections.sort(res); } return (ArrayList)res; } private void PermutationHelper(char[] cs,int i, List<String> list){ //递归终止条件,就是i下标移到char数组的末尾的时候,添加这一组字符串进入结果集中 if(i==cs.length-1){ String val=String.valueOf(cs); //判断一下是否重复 if(!list.contains(val)){ list.add(val); } }else{ //回溯法 for(int j=i;j<cs.length;j++){ swap(cs,i,j); PermutationHelper(cs,i+1,list); swap(cs,i,j); } } } private void swap(char[] cs,int i,int j){ char temp=cs[i]; cs[i]=cs[j]; cs[j]=temp; } }
非递归--字典序
import java.util.ArrayList; import java.util.Arrays; public class Solution { public ArrayList<String> Permutation(String str) { ArrayList<String> list = new ArrayList<String>(); if(str==null || str.length()==0){ return list; } char[] chars = str.toCharArray(); Arrays.sort(chars); list.add(String.valueOf(chars)); int len = chars.length; while(true){ int lIndex = len-1; int rIndex; while(lIndex>=1 && chars[lIndex-1]>=chars[lIndex]){ lIndex--; } if(lIndex == 0) break; rIndex = lIndex; while(rIndex<len && chars[rIndex]>chars[lIndex-1]){ rIndex++; } swap(chars,lIndex-1,rIndex-1); reverse(chars,lIndex); list.add(String.valueOf(chars)); } return list; } private void reverse(char[] chars,int k){ if(chars==null || chars.length<=k) return; int len = chars.length; for(int i=0;i<(len-k)/2;i++){ int m = k+i; int n = len-1-i; if(m<=n){ swap(chars,m,n); } } } private void swap(char[] chars,int i,int j){ char temp=chars[i]; chars[i]=chars[j]; chars[j]=temp; } }

浙公网安备 33010602011771号