【Leetcode152】分割回文串(回溯 | 递归)

文章目录

一、题目

二、思路

具体例子和步骤:假设 s = "aab",步骤如下:

  1. 初始状态:

    • s = "aab"
    • path = []
    • res = []
  2. 第一层递归(外层循环):

    • path = []
    • 检查 s[:1] 即 a(是回文):
      • 递归调用 dfs("ab", ["a"], res)
  3. 第二层递归:

    • s = "ab"
    • path = ["a"]
    • 检查 s[:1] 即 a(是回文):
      • 递归调用 dfs("b", ["a", "a"], res)
  4. 第三层递归:

    • s = "b"
    • path = ["a", "a"]
    • 检查 s[:1] 即 b(是回文):
      • 递归调用 dfs("", ["a", "a", "b"], res)
  5. 终止条件:

    • s = ""
    • path = ["a", "a", "b"]
    • res 加入 path,即 res = [["a", "a", "b"]]
  6. 回溯并尝试新的分割:

    • 回溯至 s = "ab",path = ["a"]
    • 检查 s[:2] 即 ab(不是回文),跳过。
    • 回溯至初始状态,s = "aab",path = []
    • 检查 s[:2] 即 aa(是回文):
      • 递归调用 dfs("b", ["aa"], res)
  7. 新的递归路径:

    • s = "b"
    • path = ["aa"]
    • 检查 s[:1] 即 b(是回文):
      • 递归调用 dfs("", ["aa", "b"], res)
  8. 终止条件:

    • s = ""
    • path = ["aa", "b"]
    • res 加入 path,即 res = [["a", "a", "b"], ["aa", "b"]]
plain 复制代码
Initial call: dfs("aab", [])
|
|-- dfs("ab", ["a"])
|   |
|   |-- dfs("b", ["a", "a"])
|   |   |
|   |   |-- dfs("", ["a", "a", "b"]) --> Add to result [["a", "a", "b"]]
|   |
|   `-- dfs("b", ["a"]) -- "ab" 不是回文,跳过
|
`-- dfs("b", ["aa"])
    |
    |-- dfs("", ["aa", "b"]) --> Add to result [["a", "a", "b"], ["aa", "b"]]

代码逻辑:

  • for i in range(1, len(s) + 1):循环从1开始到 len(s),尝试每一个可能的分割位置。
  • if self.isP(s[:i]):检查从0到 i 的子串 s[:i] 是否是回文。
  • self.dfs(s[i:], path + [s[:i]], res):如果 s[:i] 是回文,将 s[:i] 添加到路径 path 中,递归处理剩余的字符串 s[i:]。

每次递归调用会传递新的字符串 s 和更新后的路径 path(这个路径即当前方案的所有字符组合列表),直到字符串 s 为空,此时将路径 path 添加到结果列表 res 中。这样,通过递归和回溯的方法,我们可以找到所有可能的分割方案。递归调用部分:

python 复制代码
for i in range(1, len(s) + 1):
    if self.isP(s[:i]):
        self.dfs(s[i:], path + [s[:i]], res)
  • s[:i] :表示从字符串 s 的第1个字符到第 i 个字符形成的子串。
  • path + [s[:i]] :表示将当前找到的回文子串 s[:i] 添加到当前的 path 中形成一个新的列表。

三、代码

python 复制代码
class Solution(object):
    def partition(self, s):
        """
        :type s: str
        :rtype: List[List[str]]
        """
        res = []
        self.dfs(s, [], res)
        return res 

    def dfs(self, s, path, res):
        """
        s: 剩余的字符串
        path: 当前分割方案
        res: 保存所有分割方案的结果
        """
        if not s:
            res.append(path)
            return 
        for i in range(1, len(s) + 1):
            if self.isP(s[:i]):
                self.dfs(s[i:], path+[s[:i]], res)

    def isP(self, s):
        return s == s[::-1]
相关推荐
通信小呆呆4 小时前
电子战抗干扰技术:当“不被干扰”成为一种系统
算法·通信·mimo·isac
笑容掩饰我的失落4 小时前
区块链从小白到精通(八):从零实现一个标准 ERC-20 代币(完整可运行代码)
算法·区块链·php·智能合约·哈希算法
Severus_black4 小时前
【C++初阶】Stack、Queue算法题大练兵!
c语言·c++·算法·stl
2601_967979127 小时前
机器学习必修课:经典算法与Python实战
python·算法·机器学习·实战·课程
程序猿打工仔7 小时前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法
通信小呆呆7 小时前
电子战干扰技术:从“蛮力压制”到“精准欺骗”,再到“认知博弈”
算法·通信·isac
老师我太想进步了20268 小时前
【数据结构-6】算法美学之单链表(1)
数据结构·算法
希望我万事顺遂9 小时前
力扣hot100-滑动窗口最大值
数据结构·算法·leetcode
꧁细听勿语情꧂9 小时前
二叉树余题,排序、直接插入排序、希尔排序
c语言·开发语言·数据结构·算法
是main不是漫10 小时前
【双指针|LeetCode1089 复写零】巧用逆向思路,破解原地覆盖陷阱
数据结构·算法·leetcode