剑指offer-字符串的排列
题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
思路
对字符串做全排列,然后将所有排列存入set中去重,在转换为arraylist
code
public ArrayList<String> Permutation(String str) {
TreeSet<String> set = new TreeSet<>();
ArrayList<String> list = func(str);
set.addAll(list);
list.clear();
list.addAll(set);
return list;
}
// 全排列
public ArrayList<String> func(String str) {
ArrayList<String> list = new ArrayList<>();
if(str != null && str.length() == 1) {
list.add(str);
} else{
int len = str.length();
String s = str;
for (int i = 0; i < len; i++) {
char head = s.charAt(0);
ArrayList<String> list1 = func(s.substring(1));
int len1 = list1.size();
for (int i1 = 0; i1 < len1; i1++) {
list.add(head+list1.get(i1));
}
// swap
if(i != len-1) {
StringBuilder sb = new StringBuilder(str);
StringBuilder sb2 = new StringBuilder();
sb2.append(sb.charAt(i+1));
sb2.append(sb.deleteCharAt(i+1));
s = str = sb2.toString();
}
}
}
return list;
}