全排列-迭代法
思路: 全排列大家都懂,只是用迭代的方式罢了。
具体思路:
其实非常简单的啦,第一次你看到的时候,你会觉得,如果给res.add加入字符的话,不是超过n个了吗?
如果你仔细发现,其实他是根据遍历每一个字符,然后给每一个字符的前、后、中加入字符,然后遍历下一个字符的时候,是根据上一个遍历的字符串数组在进行叠加的!
——
一共有3层for循环,
第一层:遍历每一个字符。
第二层:访问上一次的字符串数组,然后给每个字符串的前、后加字符
第三层:给字符串中间加字符。
public class 全排列 {
public static void main(String[] args) {
ArrayList<String> res = new 全排列().getPermutation0("abcd");
System.out.println(res.size());
System.out.println(res);
}
public ArrayList<String> getPermutation0(String A) {
int n = A.length();
ArrayList<String> res = new ArrayList<>();
res.add(A.charAt(0) + "");//初始化,包含第一个字符
for (int i = 1; i < n; i++) {//第二个字符插入到前面生成集合的每个元素里面
ArrayList<String> res_new = new ArrayList<>();
char c = A.charAt(i);//新字符
for (String str : res) { //访问上一趟集合中的每个字符串
// 插入到每个位置,形成一个新串
String newStr = c + str; //加在前面
res_new.add(newStr);
newStr = str + c; //加在后面
res_new.add(newStr);
//加在中间
for (int j = 1; j < str.length(); j++) {
newStr = str.substring(0, j) + c + str.substring(j);
res_new.add(newStr);
}
}
res = res_new;//更新
}
return res;
}
}
24
[dcba, cbad, cdba, cbda, dbac, bacd, bdac, badc, dbca, bcad, bdca, bcda, dcab, cabd, cdab, cadb, dabc, abcd, adbc, abdc, dacb, acbd, adcb, acdb]