美文网首页
字符串的排列

字符串的排列

作者: youzhihua | 来源:发表于2020-01-15 12:05 被阅读0次

题目描述

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

思路

1.这道题可以使用回溯算法求解。
2.首先可以模拟人在写全排列的时候,是将排列中的一个字母取出来作为第一个数字固定好,然后将第二个到最后一个元素进行排列组合。
3.按照这个思路,每次从数组中选出一个元素,并记录其索引,如果该索引达到最大值,说明已经是一个排列好的组合,将其放入结果集后,进行回溯操作。
4.在每层递归空间使用一个set记录已经排到过头部的字符,防止重复。
4.最后将结果集进行排序,使其为字典序。

递归树.png

Java代码实现

public class Solution {
    public ArrayList<String> Permutation(String str) {
        ArrayList<String> res = new ArrayList<>();
        if(str.length() == 0)
            return res;
        char[] chars = str.toCharArray();
        Permutation(chars,0,str.length(),res);
        Collections.sort(res);
        return res;
    }

    public void Permutation(char[] chars,int index,int n,ArrayList<String> res) {
        if(index == n){
            res.add(new String(chars));
            return;
        }

        Set<Character> set = new HashSet<>();

        for (int i = index; i < n ; i++) {
            if(!set.contains(chars[i])){
                swapChar(chars,index,i);
                Permutation(chars,index+1,n,res);
                swapChar(chars,i,index);
                set.add(chars[i]);
            }
        }
    }

    private void swapChar(char[] chars,int i,int j){
        char temp = chars[i];
        chars[i] = chars[j];
        chars[j] = temp;
    }
}

Golang代码实现

func Permutation(str string) []string {
    res := make([]string,0)
    if len(str) == 0{
        return res
    }

    chars := make([]byte,0)

    for i:=0; i<len(str); i++{
        chars =append(chars,str[i])
    }

    PermutationDG(0,len(str),chars,&res)
    sort.Strings(res)
    return res;
}

func PermutationDG(index int,n int,chars []byte,res *[]string){
    if index == n{
        *res = append(*res,string(chars))
        return
    }

    numMap := make(map[byte]int)

    for i:=index; i<n; i++{
        if _,ok := numMap[chars[i]]; !ok{
            chars[i],chars[index] = chars[index],chars[i]
            PermutationDG(index+1,n,chars,res)
            chars[i],chars[index] = chars[index],chars[i]
            numMap[chars[i]] = i
        }
    }
}

相关文章

  • 迭代算法

    问题 输入一个字符串,给出该字符串所有的排列 问题分析 非常标准的排列问题,不考虑字符串重复的前提下共有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/asktzctx.html