131.分割回文串 Golang实现
题目描述:
给你一个字符串 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
}