第十一届蓝桥杯国赛JavaC组中含有大量的全排列加检查
例如给你一串字符“ABC”
那么它的全排列就是:
ABC
ACB
BAC
BCA
CAB
CBA
那么如何来实现全排列呢?
以下分别使用迭代和递归来实现全排列
// An highlighted block
package 全排列;
import java.util.ArrayList;
public class 字符串全排列 {
public static void main(String[] args) {
String str = "ABC";
ArrayList<String> res = new ArrayList<>();
res.add(str.charAt(0) + "");
ArrayList<String> strper = getStrper1(str, 1, res);
ArrayList<String> strper1 = getStrper(str);
for (String s : strper) {
System.out.println(s);
}
}
//递归法实现全排列
private static ArrayList<String> getStrper1(String str, int index, ArrayList<String> tmp) {
// 出口?
if (index == str.length())
return tmp;
ArrayList<String> new_res = new ArrayList<>();
for (String s :
tmp) {
String new_s = str.charAt(index) + "";
new_res.add(new_s + s);
new_res.add(s + new_s);
for (int i = 1; i < s.length(); i++) {
new_res.add(s.substring(0, i) + new_s + s.substring(i));
}
// 到这里一种情况已经既定 需要更新res
}
return getStrper1(str, index + 1, new_res);
}
// 迭代法生成字符串全排列
private static ArrayList<String> getStrper(String str) {
ArrayList<String> arr = new ArrayList<>();
// 初始化为第一个字符
arr.add(str.charAt(0)+"");
for (int i = 1; i < str.length(); i++) {
ArrayList<String> new_arr = new ArrayList<>();
char new_c = str.charAt(i);
for (String s:arr) {
// 拿一个字符出来放在前面
new_arr.add(new_c+s);
// 拿一个字符出来放在后面
new_arr.add(s+new_c);
// 加在中间
for (int j = 1; j <s.length(); j++) {
new_arr.add(s.substring(0,j)+new_c+s.substring(j));
}
}arr = new_arr;
}return arr;
}
}