LeetCode 字符串的排列全排列问题(剑指offer38)

Posted 氓浅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 字符串的排列全排列问题(剑指offer38)相关的知识,希望对你有一定的参考价值。

func permutation(s string) []string {
    //思路:使用寻找下一个增长序列(同官方解题)
    //步骤:1.升序排序 2.依次使用寻找下一个序列查找下一个符合条件的序列 3.返回结果
    bs := []rune(s)
    l := len(bs)
    if l == 0 || l > 8 {
        //panic("参数长度异常")
        return []string{}
    }

    sort.Slice(bs, func (a, b int) bool {
        return bs[a] < bs[b]
    })

    list := make([]string, 0, l)
    for {
        list = append(list, string(bs))
        if !nextPermutation(bs) {
            break
        }
    }
    return list
}

func nextPermutation(bs []rune) bool {
    l := len(bs)
    //左边起始查找位,按照之前置换原则,只有右数比左数大才能有下一个更大序列
    lIdx := l - 2
    for lIdx >= 0 && bs[lIdx] >= bs[lIdx+1] {
        lIdx--
    }
    if (lIdx < 0) {
        return false
    }
    //从最右边开始找,第一个比lIdx大的数即为,最小的大值
    rIdx := l - 1
    for rIdx >= 0 && bs[lIdx] >= bs[rIdx] {
        rIdx--
    }
    bs[lIdx], bs[rIdx] = bs[rIdx], bs[lIdx]
    //按照前面的置换原则,将后面的序列,反转即为新的升序[)
    reverse(bs[lIdx+1:])
    return true
}

func reverse(list []rune) {
    for i, l := 0, len(list); i < l/2; i++ {
        list[i], list[l-1-i] = list[l-1-i], list[i]
    }
}

以上是关于LeetCode 字符串的排列全排列问题(剑指offer38)的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer-28.全排列

[Mdfs] lc剑指 Offer 38. 字符串的排列(全排列+枚举顺序+组合类型枚举+知识理解+模板题)

剑指 Offer 38. 字符串的排列-全排列-回溯

LeetCode 剑指 Offer 38. 字符串的排列 / 31. 下一个排列 / 第 246 场周赛

剑指 Offer 38. 字符串的排列(dfs回溯实现全排列,Java)

剑指offer(27)字符串的排列