题目:
输入一个字符串,打印出该字符串中字符的所有排列。
分析一:
用递归
代码一:
package offer.xzs.thirty2thirtynine.thirtyeight;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Demo01 {
public static List<String> result = new ArrayList<>();
public static void main(String[] args) {
String str = "abc";
List<String> str1 = getStr(str);
for (int i = 0; i < str1.size(); i++) {
System.out.println(str1.get(i));
}
}
public static List<String> getStr(String str) {
if (str.length() == 0) {
return result;
}
StringBuilder sb = new StringBuilder();
char[] chars = str.toCharArray();
boolean[] cf = new boolean[chars.length];
Arrays.sort(chars);
traceback(chars, cf, sb);
return result;
}
private static void traceback(char[] chars, boolean[] cf, StringBuilder sb) {
if (chars.length == sb.length()) {
result.add(sb.toString());
return;
}
for (int i = 0; i < chars.length; i++) {
if (cf[i]) {
continue;
}
if (i != 0 && chars[i] == chars[i - 1] && !cf[i - 1]) {
continue;
}
cf[i] = true;
sb.append(chars[i]);
traceback(chars, cf, sb);
sb.deleteCharAt(sb.length() - 1);
cf[i] = false;
}
}
}
代码二:
package offer.xzs.thirty2thirtynine.thirtyeight;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Demo02 {
public static void main(String[] args) {
String str = "abc";
List<String> str1 = getStr(str);
for (int i = 0; i < str1.size(); i++) {
System.out.println(str1.get(i));
}
}
public static List<String> getStr(String str) {
List<String> result = new ArrayList<>();
if (str.length() == 0 || str == null) {
return result;
}
char[] chars = str.toCharArray();
traceback(result, chars, 0);
Collections.sort(result);
return result;
}
private static void traceback(List<String> result, char[] chars, int start) {
if (start == chars.length - 1) {
String str = String.valueOf(chars);
if (!result.contains(str)) {
result.add(str);
}
}
for (int i = start; i < chars.length; i++) {
char temp = chars[start];
chars[start] = chars[i];
chars[i] = temp;
traceback(result, chars, start + 1);
temp = chars[start];
chars[start] = chars[i];
chars[i] = temp;
}
}
}