有重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合。
示例1:
输入:S = “qqe”
输出:[“eqq”,“qeq”,“qqe”]
示例2:
输入:S = “ab”
输出:[“ab”, “ba”]
提示:
字符都是英文字母。
字符串长度在[1, 9]之间。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutation-ii-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
利用回溯+剪枝算法来求解:
class Solution {
private List<String> res = new ArrayList<>();
//标记已经使用过的字符
private int[] temp;
public String[] permutation(String S) {
if(S == null){
return null;
}
char[] arr = S.toCharArray();
//先排序
xz(arr);
S= String.valueOf(arr);
temp = new int[S.length()];
dg(S, 0 , "", res);
String[] returnArr = new String [res.size()];
for (int i = 0; i < returnArr.length; i++) {
returnArr[i] = res.get(i);
}
return returnArr;
}
private void dg(String s, int index ,String p, List<String> res){
if(index == s.length()){
res.add(p);
return;
}
/**for循环控制s的每个字符,可以这么理解,比如aab,
我们可以理解成a0,a1,b2,其中0,1,2是每个字符的下标
这样有助于我们画树形图理解。
*/
for(int i = 0; i < s.length(); i ++){
//没有使用过
if (temp[i] != 1){
/**
这里进行了剪枝,判断是否在同一层并且是否相等,这里有个问题
temp[i - 1] == 1时也是可以解答出来的,所以我一脸蒙蔽,不知
道有哪位大神可以解答下。
*/
if (i > 0 && s.charAt(i) == s.charAt(i -1) && temp[i - 1] == 0 ){
continue;
}
p = p + s.charAt(i);
temp[i] = 1;
//递归
dg(s, index + 1 , p, res);
//怎么样设置的递归完怎么回去,dfs的回退的重点所在
p = p.substring(0, p.length() - 1);
temp[i] = 0;
}
}
return;
}
public static void xz(char[] chs){
for(int i = 0; i < chs.length-1; i++){
for(int j = i+1; j<chs.length; j++){
if(chs[j] < chs[i]){
char temp = chs[j];
chs[j] = chs[i];
chs[i] = temp;
}
}
}
}
}
401



被折叠的 条评论
为什么被折叠?



