递归方式迭代字符串全排列

方式一:

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秒

 

posted @ 2022-10-23 20:44  yanher  阅读(42)  评论(0)    收藏  举报