输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
剑指 Offer 38. 字符串的排列 - 力扣(LeetCode) (leetcode-cn.com)
思路:先固定第一个字符,求后面字符的排列,递归进行,用HashSet存储所有结果可以避免重复,并用一个visited数组表示当前位置是否被访问,用StringBuilder sb存储临时结果,当sb的长度等于s的长度时,就构建好了一个字符串的排列,此时回溯
class Solution {
public String[] permutation(String s) {
if(s == null || s.length() == 0){
return new String[]{""};
}
visited = new boolean[s.length()];
arrange(s);
String[] res = new String[set.size()];
int count = 0;
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
res[count++] = iterator.next();
}
return res;
}
// String[] res;
Set<String> set = new HashSet<>();
boolean[] visited;
StringBuilder sb = new StringBuilder();
int count = 0;
public void arrange(String s){
if(sb.length() == s.length()){
set.add(sb.toString());
return;
}
for(int i = 0; i < s.length(); i++){
if(!visited[i]){
sb.append(s.charAt(i));
visited[i] = true;
arrange(s);
sb.deleteCharAt(sb.length()-1);
visited[i] = false;
}
}
}
}