题目描述:
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串。返回 s 所有可能的分割方案。
示例 1:
输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]
思路分析:
回溯法的特点:
回溯法是一种逐步递归构建解决方案,并在发现某一步没有满足条件时回溯的算法。它会尝试所有可能的解决方案,直到找到所有满足条件的结果。
这里,我们需要找到所有的分割方式,使得每个分割出来的子串是回文串。
递归和回溯的实现:
递归部分:从当前字符开始,将其分割成多个子串,每次检查当前子串是否为回文。如果是,则将其加入当前路径,递归处理剩下的部分。
回溯部分:当递归完成时,需要撤销刚才的选择,即将当前子串从路径中移除,继续尝试其他分割方式。
结束条件:
当递归到字符串的末尾时,表示已经成功找到了一个满足条件的分割方案,将该方案加入结果列表中。
解法步骤:
判断回文串:利用双指针,判断一个子串是否是回文串。
递归函数:从字符串的起始位置开始,递归尝试分割字符串。
回溯:每次递归完成后,移除刚才的选择,尝试其他可能的分割方案。 path = path[:len(path)-1]
点击查看代码
func partition(s string) [][]string { // 1.判断0值输入 if s == "" { return [][]string{} } res := [][]string{} path := []string{} // 调用回溯函数 backtracking(s, 0, &res, path) return res } func backtracking(str string, startIndex int, res *[][]string, path []string) { // 到达叶子结点,说明成功找到了一个划分方案 if startIndex >= len(str) { temp := make([]string, len(path)) copy(temp, path) *res = append(*res, temp) return } // 正常递归回溯过程 for i := startIndex; i < len(str); i++ { // 如果区间内是回文串.左闭右开 if isPalindrom(str[startIndex : i+1]) { path = append(path, str[startIndex:i+1]) // 递归调用,i+1是下一个起始位置 backtracking(str, i+1, res, path) // 回溯,撤销选择。因为一次回溯之后,必须回到上一步的状态,进行其他可能性的寻找 path = path[:len(path)-1] } } } func isPalindrom(s string) bool { for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 { if s[i] != s[j] { return false } } return true }
分类:
Go刷Leetcode
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~