LeetCode-131. 分割回文串【字符串 动态规划 回溯】

LeetCode-131. 分割回文串【字符串 动态规划 回溯】

题目描述:

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是
回文串
。返回 s 所有可能的分割方案。

示例 1:

输入:s = “aab”
输出:[[“a”,“a”,“b”],[“aa”,“b”]]
示例 2:

输入:s = “a”
输出:[[“a”]]

提示:

1 <= s.length <= 16
s 仅由小写英文字母组成

解题思路一:回溯, 回溯三部曲

  1. 递归函数参数
    全局变量数组path存放切割后回文的子串,二维数组result存放结果集。 (这两个参数可以放到函数参数里)

本题递归函数参数还需要startIndex,因为切割过的地方,不能重复切割,和组合问题也是保持一致的。

在回溯算法:求组合总和(二) (opens new window)中我们深入探讨了组合问题什么时候需要startIndex,什么时候不需要startIndex。

  1. 递归函数终止条件
    在这里插入图片描述
    从树形结构的图中可以看出:切割线切到了字符串最后面,说明找到了一种切割方法,此时就是本层递归的终止条件。

那么在代码里什么是切割线呢?

在处理组合问题的时候,递归参数需要传入startIndex,表示下一轮递归遍历的起始位置,这个startIndex就是切割线。

  1. 单层搜索的逻辑
    来看看在递归循环中如何截取子串呢?

在for (int i = startIndex; i < s.size(); i++)循环中,我们 定义了起始位置startIndex,那么 [startIndex, i] 就是要截取的子串。

首先判断这个子串是不是回文,如果是回文,就加入在vector path中,path用来记录切割过的回文子串。

class Solution:
    def partition(self, s: str) -> List[List[str]]:
        res = []
        self.backtracking(s, 0, [], res)
        return res

    def backtracking(self, s, index, path, res):
        if index == len(s):
            res.append(path[:])
            return
        for i in range(index, len(s)):
            if s[index:i+1] == s[index:i+1][::-1]: # 判断回文子串
                path.append(s[index:i+1]) # 左闭右开
                self.backtracking(s, i+1, path, res)
                path.pop()

时间复杂度:O(n2n)
空间复杂度:O(n)

解题思路二:0


时间复杂度:O(n)
空间复杂度:O(n)

解题思路三:0


时间复杂度:O(n)
空间复杂度:O(n)

相关推荐

  1. 【算法】分割动态规划】【回溯

    2024-04-06 18:40:03       36 阅读
  2. 回溯Leetcode 131. 分割【中等】

    2024-04-06 18:40:03       13 阅读
  3. LeetCode 1745.分割IV(动态规划

    2024-04-06 18:40:03       31 阅读
  4. leetcode 131. 分割

    2024-04-06 18:40:03       36 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-06 18:40:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-06 18:40:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-06 18:40:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-06 18:40:03       18 阅读

热门阅读

  1. 浅谈Yum 安装和 源码安装

    2024-04-06 18:40:03       21 阅读
  2. 常见面试题--动态规划介绍(附C++源码实现)

    2024-04-06 18:40:03       21 阅读
  3. c++ 动态分配内存

    2024-04-06 18:40:03       19 阅读
  4. 深入理解springboot

    2024-04-06 18:40:03       51 阅读
  5. 【Datax分库分表导数解决方法】MySQL_to_Hive

    2024-04-06 18:40:03       48 阅读
  6. 蓝桥杯嵌入式总结

    2024-04-06 18:40:03       13 阅读