题目

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

输入描述:

输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

思路 + 代码

典型回溯法,同 全排列 解法类似。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.util.ArrayList;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList<String> res = new ArrayList<String>();
backtracking(res, str.toCharArray(), new StringBuilder(), new boolean[str.length()]);
return res;
}
private void backtracking(ArrayList<String> res, char[] chs, StringBuilder sbd, boolean[] used){
if(chs==null || chs.length==0)
return;
else{
if(chs.length==sbd.length()){
res.add(new String(sbd.toString()));
}else{
for(int i=0; i<chs.length; i++){
if(used[i] || i>0&&chs[i]==chs[i-1]&&!used[i-1])
continue;
sbd.append(chs[i]);
used[i] = true;
backtracking(res, chs, sbd, used);
sbd.deleteCharAt(sbd.length()-1);
used[i] = false;
}
}
}
}
}

题目链接