回溯算法题目分析(二)

分割回文串问题

131.分割回文串

题目链接:131. 分割回文串 - 力扣(LeetCode) (leetcode-cn.com)

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

回文串 是正着读和反着读都一样的字符串。

示例一:

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

示例二:

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

思路

这题分为两个问题:

1.切割问题,把字符串切成若干份

2.判断回文

其中最简单最好解决的问题就是判断回文,python一行代码即可:

return True if s == s[::-1] else False

而切割问题,题目中没有限制切多少次,所以不是靠for循环暴力来解,所以我们得用回溯。

我们来看一下此题抽象为的一颗树形结构:

 递归来纵向遍历,for循环用横向遍历,当切割线到字符串结尾位置,则算遍历结束。

我们在又一次重温一下回溯算法模板:

res = []
def backtrack(未探索区域, res, path):
    if  满足条件:
        res.append(path) 
        # return  # 如果不用继续搜索需要 return
    for 选择 in 未探索区域当前可能的选择:
        if 当前选择符合要求:
            backtrack(未探索区域, res, path+已探索的区域)

所以根据这个模板,我们最后的代码如下:

class Solution:
    def partition(self, s: str) -> List[List[str]]:
        n = len(s)
        ans = []
        def huiwen(s):
            return True if s == s[::-1] else False
            
        def backtrack(s,path):
            if len(s) == 0:
                ans.append(path[:-])
                return
            for i in range(len(s)):
                ss = s[:i+1]
                if not huiwen(ss):
                    continue
                path.append(ss)
                backtrack(s[i+1:],path)
                path.pop()
        backtrack(s,[])
        return ans

其中剪枝就是满不满足字符串是否是回文。每次传的时候都是以i+1为起始位置,就是防止切割重复。

因为档期原因,接下来一期一道题目,减量不减质。


—————————————往期推荐——————————————

一看就懂,一写就懵?回溯算法讲解来了「leetcode」: 一看就懂,一写就懵?回溯算法讲解来了「leetcode」_Bangbangbang^的博客-CSDN博客icon-default.png?t=M276https://blog.csdn.net/weixin_58649388/article/details/123514694?spm=1001.2014.3001.5502

回溯算法题目分析之组合问题:

回溯算法题目分析(1)_Bangbangbang^的博客-CSDN博客icon-default.png?t=M276https://blog.csdn.net/weixin_58649388/article/details/123517154?spm=1001.2014.3001.5502

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值