LeetCode 131.分割回文串

题目

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 

回文串

 。返回 s 所有可能的分割方案。

示例 1:

输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]

示例 2:

输入:s = "a"
输出:[["a"]]

链接:

131. 分割回文串 - 力扣(LeetCode)

思路:

首先是分割字符串,我们拿出几个输出来看看 aa, b  aab  我们可以看到的就是我们中间选不选择分割, 自然想到一种选或不选

选或不选的思路是什么,我翻看了以前的习题找到了子集这道题目

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        n = len(nums)
        ans = []
        path = []
        def dfs(i):
            if i == n:
                ans.append(path.copy())
                return
            dfs(i + 1)
            path.append(nums[i])
            dfs(i + 1)
            path.pop()
        dfs(0)
        return ans

然后我们先做一个简单一点的题目,一个字符串输出我们所有的分割方法,即为我们没有回文串这个约束 aab =>   a, a,  b  aa,b  a,ab  aab  四种输出中间括号有2个 所以选或不选有4种方案

仔细思考一下我们dfs需要什么参数,选或不选那么i是肯定要的,i的含义就是第i个括号选不选,但是我们想一种情况就是第 1 个逗号不选, 第3个逗号号选, 那么我们这次加入path 的应当是第1个括号到第三个括号的字符

我们需要记得上一个我们选择的逗号是什么也就是start】

我们和上面的子集对比一下发现,如果是选或不选这个元素的话,我们无需第二个参数start,但是如果是选或不选这个逗号的话,我们需要记载这个逗号的位置,就需要第二个参数start

class Solution:
    def partition(self, s: str) -> List[List[str]]:
        ## 每个括号选还是不选
        path = []
        ans = []
        n = len(s)
        def dfs(i, start):
            if i == n:
                ans.append(path.copy())
                return
            if i < n - 1:
                dfs(i + 1, start)
            t = s[start: i + 1]
            path.append(t)
            dfs(i + 1, i + 1)
            path.pop()
        dfs(0, 0)
        return ans

然后我们思考一下这个题目就是我们的分割只有回文串的时候才可以, 所以我们只要在“选”的这里添加一个条件就是 只有start到i的字符串是回文的才可以加入

class Solution:
    def partition(self, s: str) -> List[List[str]]:
        ## 每个括号选还是不选
        path = []
        ans = []
        n = len(s)
        def dfs(i, start):
            if i == n:
                ans.append(path.copy())
                return
            if i < n - 1:
                dfs(i + 1, start)
            if t = t[::-1]:
                t = s[start: i + 1]
                path.append(t)
                dfs(i + 1, i + 1)
            path.pop()
        dfs(0, 0)
        return ans

总结:

## 选或不选模版
def dfs(i):
    if i == n:
        ans.append(path.copy())
    
    dfs(i + 1)
    
    path.append()
    dfs(i + 1)
    path.pop()


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值