題目描述
輸入一個字符串,按字典序打印出該字符串中字符的所有排列。例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的所有字符串abc,acb,bac,bca,cab和cba。
輸入描述:
輸入一個字符串,長度不超過9(可能有字符重複),字符只包括大小寫字母。
題目鏈接:牛客網
解題思路
import java.util.*;
public class Main {
public static ArrayList<String> list = new ArrayList();
public static void main(String[] args) {
String s = "abc";
printList(permutation(s));
}
public static ArrayList<String> permutation(String str) {
if (str.length() == 0) {
return list;
}
char[] ch = str.toCharArray();
Arrays.sort(ch);
backtracking(ch,new boolean[ch.length],new StringBuilder());
return list;
}
public static void backtracking(char[] chars,boolean[] hasUesd,StringBuilder sb) {
if (sb.length() == chars.length) {
list.add(sb.toString());
return;
}
for (int i = 0;i < chars.length;i++) {
if (hasUesd[i]) {
continue;
}
if (i != 0 && chars[i] == chars[i - 1] && !hasUesd[i - 1]) { // 保證不重複
continue;
}
hasUesd[i] = true;
sb.append(chars[i]);
backtracking(chars,hasUesd,sb);
sb.deleteCharAt(sb.length() - 1);
hasUesd[i] = false;
}
}
public static void printList(ArrayList list) {
for (int i = 0;i < list.size();i++) {
System.out.print(list.get(i) + " ");
}
}
}