题目概述
- 算法说明
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 - 测试用例
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
输入:
“ab”
输出:
[“ab”,“ba”]
解析&参考答案
- 解析
- 使用回溯法,回溯过程中若出现重复的则需要减枝。
- 参考答案
vim jz27.go
package main
import (
"fmt"
"sort"
"strings"
)
func Permutation(str string) []string {
if str == "" {
return nil
}
strList := make([]string, 0, len(str))
for _, v := range []byte(str) {
strList = append(strList, string(v))
}
var result []string
sort.Strings(strList)
dfs(strList, 0, &result)
return result
}
func dfs(strs []string, index int, result *[]string) {
if index == len(strs)-1 {
newStr := strings.Join(strs, "")
*result = append(*result, newStr)
return
}
for i := index; i < len(strs); i++ {
if i != index && strs[i] == strs[index] {
continue
}
strs[i], strs[index] = strs[index], strs[i]
dfs(strs, index+1, result)
}
for i := len(strs) - 1; i > index; i-- {
strs[i], strs[index] = strs[index], strs[i]
}
}
func main() {
result := Permutation("abc")
fmt.Println(result)
}
注意事项
- 递归法应该是最容易想到的方法,当然牛客题解中还有大佬使用字典序法、递增进位法、邻位互换法、递归回溯法、非递归回溯法等。
有兴趣的读者可以在牛客上查阅具体实现方法: 字符串的排列
说明
- 当前使用 go1.15.8
- 参考 牛客网--剑指offer
标题中jzn(n为具体数字)代表牛客网剑指offer系列第n号题目,例如 jz01 代表牛客网剑指offer中01号题目。
注意!!!
- 笔者最近在学习 golang,因此趁机通过数据结构和算法来进一步熟悉下go语言
- 当前算法主要来源于剑指 offer,后续会进一步补充 LeetCode 上重要算法,以及一些经典算法
- 此处答案仅为参考,不一定是最优解,欢迎感兴趣的读者在评论区提供更优解