Java 实现字符串的排列

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

代码

1、非字典排序

    /**
     * 递归输出字符串的全排列组合
     * 将字符串分为第一个字符,及剩余字符串两部分
     * 将字符串的第一个字符与剩余字符串的字符依次交换
     * 对剩余字符创重复以上操作
     * @param val
     * @param start
     */
    private static void permutationString(StringBuffer val, int start) {
        // 当start到字符串末尾时,没有可交换的字符,输出此时的排列结果
        if (start == val.length() - 1) {
            System.out.println(val);
        }
        // 将start对应的字符与后面字符串中字符依次交换位置
        // i从start开始,是为了输出自身
        for (int i = start; i < val.length(); i++) {
            // 如果要交换的位置不同,并且两个字符相等,无需交换
            // 避免aaa这种字符输出多次
            if (i != start && val.charAt(start) == val.charAt(i)) {
                continue;
            }
            // 交换两个字符的位置
            swap(val, start, i);
            // 排除当前start对应的字符,对之后的字符串进行全排列
            permutationString(val, start + 1);
            // 交换回两个字符的位置,从而使得start位置的字符和之后的字符进行交换
            swap(val, start, i);
        }
    }

    private static void swap(StringBuffer val, int i, int j) {
        char _i = val.charAt(i);
        char _j = val.charAt(j);
        val.setCharAt(i, _j);
        val.setCharAt(j, _i);
    }


    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("abc");
        Set<String> results = Sets.newHashSet();
        permutationString(sb, 0);
        for (String s : results) {
            System.out.println(s);
        }
    }

2、借助TreeSet字典排序

    private static void permutationString(TreeSet<String> results, StringBuffer val, int start) {
        // 当start到字符串末尾时,没有可交换的字符,输出此时的排列结果
        if (start == val.length() - 1) {
            results.add(val.toString());
        }
        // 将start对应的字符与后面字符串中字符依次交换位置
        // i从start开始,是为了输出自身
        for (int i = start; i < val.length(); i++) {
            // 如果要交换的位置不同,并且两个字符相等,无需交换
            // 避免aaa这种字符输出多次
            // 使用了Set集合,重复问题交由Set处理好了
            //if (i != start && val.charAt(start) == val.charAt(i)) {
            //    continue;
            //}
            // 交换两个字符的位置
            swap(val, start, i);
            // 排除当前start对应的字符,对之后的字符串进行全排列
            permutationString(results, val, start + 1);
            // 交换回两个字符的位置,从而使得start位置的字符和之后的字符进行交换
            swap(val, start, i);
        }
    }

    private static void swap(StringBuffer val, int i, int j) {
        char _i = val.charAt(i);
        char _j = val.charAt(j);
        val.setCharAt(i, _j);
        val.setCharAt(j, _i);
    }


    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("abc");
        TreeSet<String> results = Sets.newTreeSet();
        permutationString(results, sb, 0);
        for (String s : results) {
            System.out.println(s);
        }
    }

猜你喜欢

转载自blog.csdn.net/zl18310999566/article/details/80180100