递归方式迭代字符串全排列
方式一:
private void sub(char[] array, char[] temp,
ArrayList<String> resList) {
for (int i = 0; i < array.length ; i++) {
if (temp[i] != 0) {
continue;
}
temp[i] = array[i];
newStr += temp[i];
if (newStr.length() == array.length) {
if (!resList.contains(newStr)) {
resList.add(newStr);
count++;
System.out.println(count+";"+newStr);
}
//回溯
temp[i] = 0;
newStr = newStr.substring(0, newStr.length() -1);
return;
}
sub(array, temp, resList);
//回溯
temp[i] = 0;
newStr = newStr.substring(0, newStr.length() -1);
}
}
这一种方式,由于判断 字符串长度达到最大长度,加入reslist 的逻辑在 加入新元素之后,所以退出时要回溯
方式二:
private void sub(char[] array, boolean[] temp,
ArrayList<String> resList) {
if (newStr.length() == array.length) {
if (!resList.contains(newStr.toString())) {
resList.add(newStr.toString());
}
return;
}
for (int i = 0; i < array.length ; i++) {
if (temp[i] == true) {
continue;
}
temp[i] = true;
newStr.append(array[i]);
//迭代后面排列
sub(array, temp, resList);
//回溯
temp[i] = false;
newStr = newStr = newStr.deleteCharAt(newStr.length() - 1);
}
}
这一种方式把判断字符串长度达到最大,加入reslist 放在下一轮迭代。由于在下一轮迭代时没有加入新元素直接退出,退出后执行了后面的回溯逻辑。
所以一二中方式效果相同, 但是这2种方式耗时较长: 耗时425秒,count=362880
因为list的contains方法耗时较严重,所以改为hashset;耗时只有1.5秒
浙公网安备 33010602011771号