字符串的排列
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]
限制:
1 <= s 的长度 <= 8
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof
解题思路
一个很重要的思想:如果我们不知道循环多少层去解决问题的话,就可以使用递归的思想去解决。相比于回溯算法,我的思想跟回溯算法是相反的。回溯算法是从头开始指定位置填写相应值,也就是说在递归的时候第i个位置应该填写a。而我的想法是:从尾开始指定填写相应的值。这样说可能很复杂,下面我画个图:
还有因为题目说不能有重复。这里的解决办法是:为了确保相同的字符串传入同一目标位置的动作只发生一次,对原先的字符串进行排序,也就是将相同的大小的值放在一起。对同一个位置进行选择的时候,判断一下当i>0是,s[i-1]是否等于s[i]。
代码
func permutation(s string) []string {
result := make([]string,len(s))
for i:=0;i<len(s);i++{
result[i] = string(s[i])
}
sort.Strings(result)
s = ""
for i:=0;i<len(result);i++{
s += result[i]
}
return dfs(s)
}
func dfs(s string)[]string{
if len(s)==1{
return []string{s}
}
result := make([]string,0)
for i:=0;i<len(s);i++{
if i>0 && s[i]==s[i-1]{
continue
}
tmpS := s[:i] + s[i+1:]
tmp := dfs(tmpS)
for j:=0;j<len(tmp);j++{
tmp[j] = string(s[i]) + tmp[j]
}
result = append(result,tmp...)
}
return result
}
这个思路还有一个需要优化的地方就是:每一次递归函数返回的时候都需要:
tmp := dfs(tmpS)
for j:=0;j<len(tmp);j++{
tmp[j] = string(s[i]) + tmp[j]
}
目前想到的办法只能是改为回溯了,从头开始指定位置。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)