方式一:
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 放在下一轮迭代。由于在下一轮迭代时没有加入新元素直接退出,退出后执行了后面的回溯逻辑。
所以一二中方式效果相同
原文地址:http://www.cnblogs.com/yanher/p/16819481.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性