题号:no47
题目名:无重复字符串的排列组合
原题URL:https://leetcode-cn.com/problems/permutation-i-lcci/
题目描述
无重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合,字符串每个字符均不相同。
示例
示例 1:
输入:S = "qwe"
输出:["qwe", "qew", "wqe", "weq", "ewq", "eqw"]
示例 2:
输入:S = "ab"
输出:["ab", "ba"]
限制
- 字符都是英文字母。
- 字符串长度在[1, 9]之间。
思路
1.思路就是dfs+剪枝,也就是回溯算法
//回溯模板
private void backtrack("原始参数") {
//终止条件(递归必须要有终止条件)
if ("终止条件") {
//一些逻辑操作(可有可无,视情况而定)
return;
}
for (int i = "for循环开始的参数"; i < "for循环结束的参数"; i++) {
//一些逻辑操作(可有可无,视情况而定)
//做出选择
//递归
backtrack("新的参数");
//一些逻辑操作(可有可无,视情况而定)
//撤销选择
}
}
解题代码
List<String> strs= new ArrayList<>();
public String[] permutation(String S) {
if(S==null||S.length()==0) return null;
int[] used = new int[9];
//dfs
char[] chars = S.toCharArray();
StringBuilder str = new StringBuilder();
dfs(chars,used,str);
return strs.toArray(new String[0]);
}
private void dfs(char[] chars, int[] used, StringBuilder str) {
//终止条件
if(str.length() == chars.length) {
strs.add(str.toString());
return;
}
//循环遍历
for (int i = 0; i < chars.length; i++) {
if(used[i]==1) continue;
str.append(chars[i]);
//标记
used[i]=1;
//递归
dfs(chars, used, str);
//去标记+剪枝
used[i]=0;
str.deleteCharAt(str.length()-1);
}
}