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
}

posted @ 2024-09-26 15:58  wochh  阅读(5)  评论(0编辑  收藏  举报