有重複字符串的排列組合。編寫一種方法,計算某字符串的所有排列組合。
示例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;
}
}
}
}
}