剑指 Offer 38. 字符串的排列
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = “abc”
输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]
限制:
1 <= s 的长度 <= 8
题解
这种题目要使用dfs+剪枝,但我不会(5555~)
这里主要是采用循环加固定首字母
class Solution {
public String[] permutation(String s) {
//双重循环???
//对s进行排序
String [] kk = s.split("");
Arrays.sort(kk);
StringBuilder sb = new StringBuilder();
for(String x:kk) sb.append(x);
//这里是排序好了的字符串
s = sb.toString();
//然后清空
sb.delete(0,sb.length());
List<String> list = new LinkedList<>();
boolean [] used = new boolean[s.length()];
dfs(sb,s,used,list);
return list.toArray(new String[list.size()]);
}
public void dfs(StringBuilder sb,String s,boolean[] used,List<String> list){
//说明排序好了,增加一个字符
if(sb.length() == s.length()){
list.add(sb.toString());
return;
}
for(int i=0;i<s.length();i++){
//与前一个字母相等,且前一个字母标记为false,说明前一个字母已经被回溯过,同级,不能再使用当前字母,否则重复
if(i>0 && !used[i] && s.charAt(i)==s.charAt(i-1) && !used[i-1]) continue;
if(!used[i]){
sb.append(s.charAt(i));
used[i] = true;
dfs(sb,s,used,list);
sb.delete(sb.length()-1,sb.length());
used[i] = false;
}
}
}
}