方式一:

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. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性