题目:

请根据以下框架代码,编写函数 perm() ,打印输⼊字符串的所有排列。即对于字符串
ABC ,打印输出以下内容,不需要按照特定顺序。
ABC
ACB
BAC
BCA
CBA
CAB

框架代码:

package main
import "fmt"
// Perm() 对 a 形成的每⼀排列调⽤ f().
func Perm(a []rune, f func([]rune)) {
perm(a, f, 0) }
// 对索引 i 从 0 到 len(a) - 1,实现递归函数 perm().
func perm(a []rune, f func([]rune), i int) {
// TODO
}
func main() {
Perm([]rune("ABC"), func(a []rune) {
 fmt.Println(string(a)) }) }

实现:

package main

import "fmt"

// Perm() 对 a 形成的每⼀排列调⽤ f().
func Perm(a []rune, f func([]rune)) {
    perm(a, f, 0)
}

// 对索引 i 从 0 到 len(a) - 1,实现递归函数 perm().
func perm(a []rune, f func([]rune), i int) {
    alen := len(a)
    if i == alen {
        f(a)
        return
    }
    aMap := make(map[rune]struct{})
    for index := i; index < alen; index++ {
        //去重
        if _, ok := aMap[a[index]]; ok {
            continue
        }
        aMap[a[index]] = struct{}{}
        swap(a, index, i)
        //求i+1 从 len(a) - 1的全排列
        perm(a, f, i+1)
        swap(a, index, i)
    }
}

func swap(b []rune, i int, j int) {
    if i == j || b[j] == b[i] {
        return
    }
    tmp := b[j]
    b[j] = b[i]
    b[i] = tmp
}

func main() {
    Perm([]rune("ABC"), func(a []rune) {
        fmt.Println(string(a))
    })
}

标签: none

添加新评论