题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
import java.util.ArrayList;
import java.util.Arrays;
import java.lang.Character;
public class Solution {
private ArrayList<String> result=new ArrayList<String>();
public ArrayList<String> Permutation(String str) {
if(str==null)
return result;
if(str.length()==0)
return result;
char[] ch=str.toCharArray();
Arrays.sort(ch);
StringBuilder s=new StringBuilder();
boolean[] flag=new boolean[ch.length];
sort(ch,s,flag);
return result;
}
private void sort(char[] ch, StringBuilder s, boolean[] flag){
if(s.length()==ch.length)
{
result.add(s.toString());
return;
}
//s上一位的所有可能情况
for(int i=0;i<ch.length;i++)
{
if(flag[i]==true)
continue;
if(i!=0&&ch[i]==ch[i-1]&&flag[i-1]==false)//重复字符必须在先前重复字符都被使用了的情况下才能使用 这也是前面要先对ch排序的原因
continue;
s.append(ch[i]);
flag[i]=true;
sort(ch,s,flag);//进行s的下一位
s.deleteCharAt(s.length()-1);
flag[i]=false;
}
}
}
String——>char[]
记录结果——>StringBuilder
在s的每一位上遍历所有可能性,一共有ch.length种情况,而不是在ch的每一位上遍历
先对ch进行排序,这样可以使重复的字符相邻
只有当前面的重复字符使用后才能使用后续重复字符,以避免重复,因为两个字符是相同的而第一个字符还未被使用的话,当前的所有情况也是后续使用第一个字符的所有情况,会发生重复