题目
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = “abc”
输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]
限制:
1 <= s 的长度 <= 8
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof
解题思路
- 模拟路径
- 利用回溯法,拿到解空间上的所有结果。
- 由于原字符串可能会有重复元素,所以可以通过“剪枝”来跳过重复情况的遍历。
- 剪枝
- 在每次的遍历中,使用 map 来记录元素是否被使用过,如果使用过,那么说明是重复元素,直接跳过。
- 在每次的遍历中,使用 map 来记录元素是否被使用过,如果使用过,那么说明是重复元素,直接跳过。
解题思路引用自作者:心谭
代码
func permutation(s string) []string {
if len(s) == 0{
return nil
}
if len(s) == 1{
return []string{s}
}
ret := []string{}
tmp := []string{}
for _,c :=range s{
tmp = append(tmp,string(c))
}
helper(&ret,tmp,"")
return ret
}
func helper(ret *[]string,str []string,path string){
if len(str) == 0 {
*ret = append(*ret,path)
}
m := make(map[string]bool)
for i,_ :=range str{
//剪枝,避免重复元素
if _,has := m[str[i]]; !has{
m[str[i]] = true
newPath := path + string(str[i])
newStr := []string{}
newStr = append(newStr,str[:i]...)
newStr = append(newStr,str[i+1:]...)
helper(ret,newStr,newPath)
}
}
return
}