美文网首页
字符串的排列

字符串的排列

作者: Michaelhbjian | 来源:发表于2019-06-24 11:07 被阅读0次

全排列算法的思路大概是我们可以把一个字符串看成由两部分组成:一部分分为它的第一个字符,第二部分是后面的所有字符。

46.全排列

题目:

给定一个没有重复数字的序列,返回其所有可能的全排列。

示例:

输入: [1,2,3]
输出:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

解题思路:

  • 1、我们把整个字符串的排列分为两步:首先求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。(比如现在第一个字符是1,初始序列为[1,2,3]。然后把1和2交换得到[2,1,3]。最后1和3交换得到序列为[3,2,1]
  • 2、第二步就是固定第一个字符,求后面字符的第一个字符,以及这个字符之后的所有字符。然后把第一字符逐一和它后面的字符交换。

Permutations

package com.zhoujian.solutions.leetcode;

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

/**
 * @author zhoujian123@hotmail.com 2018/8/17 15:35
 */
public class Permutation {
    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> list = new ArrayList<List<Integer>>();
        // Arrays.sort(nums); // not necessary
        backtrack(list, new ArrayList<Integer>(), nums);
        return list;
    }

    private void backtrack(List<List<Integer>> list, List<Integer> tempList, int [] nums){
        if(tempList.size() == nums.length){
            list.add(new ArrayList<Integer>(tempList));
        } else{
            for(int i = 0; i < nums.length; i++){
                if(tempList.contains(nums[i])) continue; // element already exists, skip
                tempList.add(nums[i]);
                backtrack(list, tempList, nums);
                tempList.remove(tempList.size() - 1);
            }
        }
    }

    public static void main(String[] args) {
//        int[] nums = {1,2,3};
        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();
        String[] s = line.split(" ");
        int[] nums = new int[s.length];
        for (int i = 0; i < s.length; i++) {
            nums[i] = Integer.parseInt(s[i]);
        }
        Permutation permutation = new Permutation();
        List<List<Integer>> listList = permutation.permute(nums);
        System.out.println(listList);
    }
}

结果如下:

image.png

扩展题

如果不是求字符的所有排列,而是求字符的所有组合,应该怎么办呢?还是输入三个字符a、b、c,则它们的组合有a、b、c、ab、ac、bc、abc。当交换字符串中的两个字符时,虽然能得到两个不同的排列,但却是同一个组合。比如ab和ba是不同的排列,但只算一个组合。

相关文章

  • 迭代算法

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

  • LeetCode - 0006 - ZigZag Convers

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

  • 38:字符串的排列

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

  • 字符串的全排列

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

  • JZ-027-字符串的排列

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

  • 剑指offer - 字符串的排列

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

  • iOS排列组合算法

    问题1、求长度为N的字符串的所有排列,如字符串abc所有排列为:abc,acb,bac,bca,cab,cba。问...

  • 《剑指offer第二版》面试题38:字符串的排列(java)

    题目描述 输入一个字符串,打印出该字符串的所有排列,例如输入字符串abc,则所有的排列为:abc、acb、bac、...

  • 《剑指offer》

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

  • 《剑指offer》— JavaScript(27)字符串的排列

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

网友评论

      本文标题:字符串的排列

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