递归递归!!!
字符串的全排列
此处采用的方式将字符串分为两部分
1. 固定一个字符,将之后的字符串全排列
2. 将固定字符与之后的字符依次交换
盗图如下,产生的字符串顺序为最后一行从左到右~
代码中有两种包含重复字符的解决方案
1. 在将重排后的字符串输出时,判断是否重复过,若重复过,则不做处理
2. 将字符与之后的字符交换时,对于重复的字符仅交换一次,这样避免了重复字符串的出现
首先是递归算法
方案1:
1 import java.util.*; 2 3 public class Solution_permutation { 4 public static void main(String[] args) { 5 String a = "abb"; 6 Solution_permutation x = new Solution_permutation(); 7 System.out.println(x.Permutation(a)); 8 } 9 @SuppressWarnings("null") 10 public ArrayList<String> Permutation(String str) { 11 ArrayList<String> ans=new ArrayList<String>();//所有排列的可能都在这里 12 if(str!=null||str.length()>0){ 13 help(0,str.toCharArray(),ans); 14 Collections.sort(ans); 15 } 16 return ans; 17 } 18 public static void help(int i,char[] cha,ArrayList<String> ans){ 19 if(i==cha.length-1){ 20 String val = String.valueOf(cha); 21 if(!ans.contains(val)){ 22 ans.add(val);//避免重复 23 } 24 }else{ 25 for(int j=i;j<cha.length;j++){ 26 swap(i,j,cha);//依次选一个数固定住 27 help(i+1,cha,ans);//让后面的进行全排列 28 swap(i,j,cha);//恢复原来的模样,回溯关键 29 } 30 } 31 } 32 public static void swap(int i,int j,char[] cha){ 33 char temp=cha[i]; 34 cha[i]=cha[j]; 35 cha[j]=temp; 36 } 37 }
方案2
1 import java.util.*; 2 3 public class Solution_permutation { 4 public static void main(String[] args) { 5 String a = "abb"; 6 Solution_permutation x = new Solution_permutation(); 7 System.out.println(x.Permutation(a)); 8 } 9 public ArrayList<String> Permutation(String str) { 10 ArrayList<String> list=new ArrayList<String>(); 11 if(str!=null&&str.length()>0){ 12 PermutationHelper(str.toCharArray(),0,list); 13 Collections.sort(list); 14 } 15 return list; 16 } 17 private void PermutationHelper(char[] chars,int i,ArrayList<String> list){ 18 if(i == chars.length-1){ 19 list.add(String.valueOf(chars)); 20 }else{ 21 Set<Character> charSet = new HashSet<Character>(); 22 for(int j=i;j<chars.length;++j){ 23 if(j==i||!charSet.contains(chars[j])){//避免重复,即当将字符串进行交换时,若交换的字符之前交换过一次,则该次不再交换。 24 charSet.add(chars[j]); 25 swap(chars,i,j); 26 PermutationHelper(chars,i+1,list); 27 swap(chars,j,i); 28 } 29 } 30 } 31 } 32 private void swap(char[] cs,int i,int j){ 33 char temp = cs[i]; 34 cs[i] = cs[j]; 35 cs[j] = temp; 36 } 37 }
还是感觉有点混沌。之后需要再看递归递归~~~