剑指offer-字符串的排列
题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
public class Solution {
ArrayList<String> ans = new ArrayList<>();
public ArrayList<String> Permutation(String str) {
if(str.isEmpty()){
return ans;
}
Set<String> ret = new HashSet<>();
Rec(0,str,ret);
return ans;
}
public void Rec(int pos, String s, Set<String> ret){
if(pos+1 == s.length()){
if(!ret.contains(s)){
ans.add(s);
}
ret.add(s);
return;
}
for (int i = pos; i<s.length(); ++i){
char[] swap = s.toCharArray();
char c = swap[i];
swap[i] = swap[pos];
swap[pos] = c;
s = new String(swap);
Rec(pos+1,s,ret);
swap = s.toCharArray();
c = swap[i];
swap[i] = swap[pos];
swap[pos] = c;
}
}
}