方式一:
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 放在下一轮迭代。由于在下一轮迭代时没有加入新元素直接退出,退出后执行了后面的回溯逻辑。
所以一二中方式效果相同
标签:递归,temp,newStr,length,字符串,resList,array,迭代 From: https://www.cnblogs.com/yanher/p/16819481.html