题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba;
输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
解题思路
private ArrayList<String> result = new ArrayList<String>();
public ArrayList<String> Permutation(String str) {
if (str.length() == 0){
return result;
}
char[] chars = str.toCharArray();
Arrays.sort(chars); //进行排序,这一步很关键
backTracking(chars,new boolean[chars.length], new StringBuffer());
return result;
}
private void backTracking(char[] chars,boolean[] hasUsed,StringBuffer s){
if (s.length() == chars.length) {
result.add(s.toString()); //产生了新的结果
return;
}
for (int i = 0; i < chars.length; i++) {
if (hasUsed[i]){
continue;
}
if (i != 0 && chars[i] == chars[i - 1] && !hasUsed[i - 1]){
continue; // 保证不重复
}
hasUsed[i] = true; //标记为已经访问过
s.append(chars[i]); //加入
backTracking(chars, hasUsed, s);
s.deleteCharAt(s.length() - 1);
hasUsed[i] = false;
}
}