美文网首页
字符串的排列(java)

字符串的排列(java)

作者: 夏臻Rock | 来源:发表于2018-06-08 16:19 被阅读0次

题目描述:

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

输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

分析:

重点在:全排列按照字典序

思路:把需要全排列的字符串分为两部分:

  • 字符串的第一个字符
  • 第一个字符后面的所有字符(待全排列字符)

为了得到所有可能在第一个位置的字符,我们将第一个字符依次和后面的字符进行一次交换;交换完成后,固定第一个字符,对后面的所有字符求全排列,显然后面的所有字符也可以如上的分为两个部分。

显然,递归可解。

那么,在这种方法下如何保证“按照字典序”呢?
我们需要知道,ArrayList实现了Collection接口,实现了sort()方法,其中String类型可以直接使用sort()来实现默认的正序排序。

  1. 对于String或Integer这些已经实现Comparable接口的类来说,可以直接使用Collections.sort方法传入list参数来实现默认方式(正序)排序;
  2. 如果不想使用默认方式(正序)排序,可以通过Collections.sort传入第二个参数类型为Comparator来自定义排序规则;
  3. jdk1.8的Comparator接口有很多新增方法,其中有个reversed()方法比较实用,是用来切换正序和逆序的;

解答:

import java.util.ArrayList;
import java.util.Collections;

public class Solution {
    public ArrayList<String> Permutation(String str) {
       if (str == null) return null;
        //把字符串转化为数组
        char[] ins = str.toCharArray();
        ArrayList<String> list = new ArrayList<>();
        DoPermutation(ins, 0, list);
        //按字典排序
        Collections.sort(list);
        return list;
    }

    private static void DoPermutation(char[] ins, int i, ArrayList<String> list) {
        if (ins == null) return;
        //如果i指向了最后一个字符
        if (i == ins.length - 1) {
            if (list.contains(String.valueOf(ins))) {
                return;
            }
            list.add(String.valueOf(ins));
        }
        //当i不指向最后一个时,i代表我们做排列操作的字符串的第一个字符
        else {
            for(int j=i;j<ins.length;j++) {
                swap(ins, i, j);//将第一个字符与后面的字符交换
                DoPermutation(ins, i + 1, list); //对后面的字符进行全排列
                swap(ins, j, i);//再将之前交换的字符交换回来,以便于第一个字符再与其他字符进行交换
            }
        }
    }

    /*交换*/
    private static void swap(char[] ins, int i, int j) {
        char tmp = ins[i];
        ins[i] = ins[j];
        ins[j] = tmp;
    }
}
运行成功

相关文章

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

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

  • 字符串的排列(java)

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

  • 字符串的排列问题(Java)

    问题描述: 输入一个字符串,打印出该字符串的所有排列。例如,输入字符串”abc”,则输出有字符’a’,’b’,’c...

  • 【算法】字符串的排列(Java)

    题目 输入一个字符串,打印出该字符串中的字符的所有排列,例如输入字符串abc;则打印出由字符a,b,c排列出来的所...

  • 字符串的排列(全排列)——Java回溯法

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

  • Java 字符串全排列显示

    每日一经 每天收集一个java日常能用到的解决问题的方法,以后方便查阅。 实现 java8环境,使用了stream

  • 迭代算法

    问题 输入一个字符串,给出该字符串所有的排列 问题分析 非常标准的排列问题,不考虑字符串重复的前提下共有n!种排列...

  • LeetCode - 0006 - ZigZag Convers

    题目概要 将字符串按照ZigZag的顺序重新排列,求排列之后的新字符串。 题目链接 ZigZag Conversi...

  • 38:字符串的排列

    题目38:字符串的排列 输入一个字符串,打印出该字符串中字符的所有排列。 举例说明 例如输入字符串abc。则打印出...

  • 字符串的全排列

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

网友评论

      本文标题:字符串的排列(java)

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