问题
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
思考
如果字符串没有重复的内容,可以使用递归:
例如abc可以考虑a(bc),b(ac),c(ab),三种情况
而括号里面的继续按照外面的顺序递归求出。
但是如果字符串里有重复的呢?
a(bb),b(ab),b(ab)显然是重复了。
并且到bb,以后如果bb交换,又重复了一次
所以递归之前得加个判断,是否和要交换的字符相等
code
import java.util.*;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList<String> result=new ArrayList<String>();
if(str!=null&&str.length()>0){
quanPaiXu(str.toCharArray(),0,result);
Collections.sort(result);
}
return result;
}
public void quanPaiXu(char[] str,int index,ArrayList<String> result){
if(index==str.length-1){
result.add(new String(str));
}else{
HashSet<Character> charSet=new HashSet<Character>();
charSet.add(str[index]);
quanPaiXu(str,index+1,result);
for(int i=index+1;i<str.length;i++){
if(!charSet.contains(str[i])){
charSet.add(str[i]);
swap(str,index,i);
quanPaiXu(str,index+1,result);
swap(str,i,index);
}
}
}
}
public void swap(char[] str,int i,int j){
char temp=str[i];
str[i]=str[j];
str[j]=temp;
}
}