zoukankan      html  css  js  c++  java
  • JZ27 字符串的排列

    字符串的排列

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

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

    思路:

    对于一个长度为 nn 的字符串(假设字符互不重复),其排列方案数共有:n×(n−1)×(n−2)…×2×1

    排列方案的生成:根据字符串排列的特点,考虑深度优先搜索所有排列方案。即通过字符交换,先固定第 11 位字符( nn 种情况)、再固定第 22 位字符( n-1n−1 种情况)、... 、最后固定第 nn 位字符( 11 种情况)。

    当字符串存在重复字符时,排列方案中也存在重复的排列方案。为排除重复方案,需在固定某位字符时,保证 “每种字符只在此位固定一次” ,即遇到重复字符时不交换,直接跳过。从 DFS 角度看,此操作称为 “剪枝” 。

    func Permutation(s string) []string {
        var ans []string
        newStr := make([]string, len(s))
        for k, v := range s {
            newStr[k] = string(v)
        }
        sort.Strings(newStr)
        n := len(s)
        perm := ""
        vis := make([]bool, n)
        var backtrack func(int)
        backtrack = func(idx int) {
            if idx == n {
                ans = append(ans, perm)
            }
            for i, v := range newStr {
                if vis[i] || i > 0 && !vis[i-1] && v == newStr[i-1] {
                    continue
                }
                perm += v
                vis[i] = true
                backtrack(idx + 1)
                vis[i] = false
                perm = perm[:len(perm)-1]
            }
        }
        backtrack(0)
        return ans
    }
  • 相关阅读:
    Python3之random模块常用方法
    Go语言学习笔记(九)之数组
    Go语言学习笔记之简单的几个排序
    Go语言学习笔记(八)
    Python3之logging模块
    Go语言学习笔记(六)
    123. Best Time to Buy and Sell Stock III(js)
    122. Best Time to Buy and Sell Stock II(js)
    121. Best Time to Buy and Sell Stock(js)
    120. Triangle(js)
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/14639300.html
Copyright © 2011-2022 走看看