时间:2021.09.01
环境:
目的:Go语言实现字符串全排列
说明:
作者:Zhong QQ交流群:121160124 欢迎加入!
简单版
package main
import (
"fmt"
)
func main() {
str := "abcd"
res_slice := Arrange(str, 0, "")
fmt.Println(res_slice)
}
// 字符串全排列 可指定位数
var res_slice = []string {}
func Arrange(str string, length byte,s string) []string {
if len(str) == 0 {
return res_slice
} else if len(str) == 1 {
res_slice = append(res_slice, s + string(str[0]))
}
for i, v := range str {
//fmt.Println(i, string(v))
Arrange(str[:i] + str[i+1:], length, s + string(v))
}
return res_slice
}
二维数组版
package main
import (
"fmt"
)
var str = "abcd" // 需要生成全排列的字符串
var res_slice [][]string // 生成的结果容器
var second_slice []string // res_slice里的二级切片
var second_slice_len int = Factorial(len(str)) / len(str) // 计算以每个字符串中的字符开始会产生的个数(res_slice里的二级切片的长度)
func main() {
res_slice := Arrange(str,"")
fmt.Println(res_slice)
}
// 生成二维切片
func Arrange(str string, s string) [][]string {
if len(str) == 0 {
return res_slice
} else if len(str) == 1 {
t := s + string(str[0]) // 生成的一个单位的元素数据
second_slice = append(second_slice, t) // 加入到二维数据里面
// 每<second_slice_len>个长度为一个切片
if len(second_slice) == second_slice_len {
res_slice = append(res_slice, second_slice)
second_slice = []string{}
}
}
// 递归处理生成数据
for i, v := range str {
Arrange(str[:i] + str[i+1:], s + string(v))
}
return res_slice
}
func Factorial(n int) (res int) {
if (n > 0) {
res = n * Factorial(n-1)
return res
}
return 1
}
关注微信公众号