全排列
题目:
请根据以下框架代码,编写函数 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))
})
}