美文网首页
Java打印任意字符串的全排列,全网最优解

Java打印任意字符串的全排列,全网最优解

作者: 普恩一昂 | 来源:发表于2020-07-12 09:04 被阅读0次

最近遇到一道题:打印任意字符串的全排列,如输入"ABC",打印ABC CBA ACB CAB BAC BCA

像这种工作中不常用的算法竟然一时没有想出来,作为知名大厂的高级工程师,我的内心告诉我,必须将它解决,

大概找了一下网上的解决方案,没有找到我认为的最优解,所以分享出我的解决方案。

全排列的原理是将每一个元素,与其他剩下的所有元素分别组合一次。

编程建模思想:将每一个元素,与其他剩下的所有元素分别组合一次,如果剩下的元素数大于2,则使用递归拆分第一个和剩下的,直到只剩下2个元素,交换两个元素的位置并拼接打印,结束递归。

如果我的文字描述还是没有讲清楚,仔细观察一下代码中的全排列注释中的全排列结果集,就能看出全排列的规律,而程序就是这个规律的实现。

import java.util.ArrayList;
import java.util.List;

public class FullPermutation {

    public static void fullPermutation(String str) {
        char[] chars = str.toCharArray();
        List<Character> characterList = new ArrayList<>();
        for (char c : chars) {
            characterList.add(c);
        }
        recursivePermutation("", characterList);
    }

    /**
     * algorithm: every element should combine with all other left elements,
     * if other elements length larger than 2 then recursive split first and left 
     * until left only two elements, then exchange this two elements.
     *
     * <p>
     * 1234 1243
     * 1324 1342
     * 1423 1432
     * <p>
     * 2134 2143
     * 2314 2341
     * 2413 2431
     * <p>
     * 3124 3142
     * 3214 3241
     * 3412 3421
     * <p>
     * 4123 4132
     * 4213 4231
     * 4312 4321
     */

    // arranged must be String, can not use StringBuilder
    private static void recursivePermutation(String arranged, List<Character> leftElements) {
        if (leftElements.size() > 2) {
            for (int i = 0; i < leftElements.size(); i++) {
                Character element = leftElements.get(i);
                List<Character> newLeftElements = new ArrayList<>(leftElements);
                newLeftElements.remove(i);
                //recursive split and combine
                recursivePermutation(arranged + element, newLeftElements);
            }
        } else if (leftElements.size() == 2) {
            //exchange the last two elements
            //print arranged + elements.get(0) + elements.get(1)
            System.out.print(arranged);
            System.out.print(leftElements.get(0));
            System.out.print(leftElements.get(1));
            System.out.print("\n");
            //print arranged + elements.get(1) + elements.get(0)
            System.out.print(arranged);
            System.out.print(leftElements.get(1));
            System.out.print(leftElements.get(0));
            System.out.print("\n");
        }
    }


    public static void main(String[] args) {
        fullPermutation("ABCD");
    }
}

相关文章

  • Java打印任意字符串的全排列,全网最优解

    最近遇到一道题:打印任意字符串的全排列,如输入"ABC",打印ABC CBA ACB CAB BAC BCA 像这...

  • 初遇DFS

    1. 字符串的排列 输入一个字符串,打印出该字符串中字符的所有排列。 你可以以任意顺序返回这个字符串数组,但里面不...

  • 字符串的全排列

    字符串的全排列 题目描述: 输入一个字符串,打印出该字符串中字符的所有排列。 例如输入字符串abc,则输出由字符a...

  • 使用JS打印问题汇总

    页面内打印任意元素(最优解:使用生成Iframe的方式) 页面大小 -PDF文件对应的HTML页面的宽度为【820...

  • 2022-02-15 1380. 矩阵中的幸运数

    送分题 java版本: 剑指offer 38:字符串的排列类似于全排列+支持相同字符Go版本:

  • 全排列

    刷到剑指offer的一道全排列的题,如下: 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串...

  • 全排列 n皇后

    输入一个字符串打印出这个字符串的全排列,剑指上面是字符串没有重复字母的,牛客上面输入有重复字母,要求搞掉重复的排列...

  • (*)剑指offer 面试题28:字符串的全排列

    题目:输入一个字符串,打印出该字符串中字符的所有排列。 解法:递归的思路。以abc为例,固定首字母,剩余部分全排列...

  • 全排列(有重复序列)

    题目:输入一个字符串,打印出该字符串中字符的所有排列(存在重复的字符),你可以以任意顺序返回这个字符串数组,但里面...

  • 剑指 Offer 38. 字符串的排列

    输入一个字符串(可能包含重复字符),打印出该字符串中字符的所有排列。 你可以以任意顺序返回这个字符串数组,但里面不...

网友评论

      本文标题:Java打印任意字符串的全排列,全网最优解

      本文链接:https://www.haomeiwen.com/subject/yphgcktx.html