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
    }
  • 相关阅读:
    ITIL 4Foundation认证
    Linux服务器安全之 fail2ban的安装与配置
    Linux的常用基础命令
    jQuery源码学习(2):选择器初窥
    jQuery源码学习(1):整体架构
    从字符串拼接看JS优化原则
    理解函数作用域与闭包
    JavaScript DOM节点操作总结
    函数声明与函数表达式、变量提升
    CSS长度单位详解
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/14639300.html
Copyright © 2011-2022 走看看