给定一个字符串,打印该字符串中字符的全排序。例如输入ab,打印ab和ba‘;输入abc,打印abc,acb,bac,bca,cab,cba。
方法:将字符存入set中,循环取,每取出一个,求剩下字符的全排列;如果set中只有一个字符,则返回这个字符。
详细代码
public class FullArranged {
public static List<String> fullArranged(HashSet<Character> characterHashSet) {
List<String> result = new ArrayList<>();
if (characterHashSet.size() == 1) {
for (Character character : characterHashSet) {
result.add(String.valueOf(character));
return result;
}
}
for (Character character : characterHashSet) {
HashSet<Character> copy = (HashSet<Character>)characterHashSet.clone();
copy.remove(character);
List<String> sub = fullArranged(copy);
for (String s : sub) {
result.add(String.valueOf(character) + s);
}
}
return result;
}
public static void main(String[] args) {
String s = "abcd";
HashSet<Character> characterHashSet = new HashSet<>();
for (int i = 0; i < s.length(); i++) {
characterHashSet.add(s.charAt(i));
}
System.out.println(JSON.toJSONString(fullArranged(characterHashSet)));
}
}
该算法的时间复杂度为O(n!),相当于穷举。
以上的代码有一个问题,就是出现重复字符如何处理?
如果出现重复字符,将不能使用set,因为set会过滤重复字符;需要改成用list。按照上面的方式循环list,将结果存放到set中用来过滤重复的字符串。时间复杂度不变。