Leetcode-分割回文串

本文介绍了如何使用回溯法解决LeetCode中的分割回文串问题,详细阐述了解题思路,包括如何构建递归树并进行剪枝操作。还探讨了回溯法的优化——记忆化搜索,通过预先计算最长回文子串以提高效率。最后,给出了回溯法和优化后的代码实现。
摘要由CSDN通过智能技术生成

目录

1.题目描述

2.解题思路

3. 源代码

3.1  回溯法

3.2  回溯的优化(记忆化搜索)

4. 总结


1.题目描述

给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。

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

示例1:

输入: "aab"
输出: 1
解释: 进行一次分割就可将 s 分割成 ["aa","b"] 这样两个回文子串。

2.解题思路

本题这涉及到两个关键问题:

切割问题,有不同的切割方式
1.判断回文
2.相信这里不同的切割方式可以搞懵很多同学了。

这种题目,想用for循环暴力解法,可能都不那么容易写出来,所以要换一种暴力的方式,就是回溯。

一些同学可能想不清楚 回溯究竟是如果切割字符串呢?

我们来分析一下切割,其实切割问题类似组合问题。

例如对于字符串abcdef:

组合问题:选取一个a之后,在bcdef中再去选取第二个,选取b之后在cdef中在选组第三个.....。
切割问题:切割一个a之后,在bcdef中再去切割第二段,切割b之后在cdef中在切割第三段.....。

基本确定问题的主要思路是回溯法。回溯法的主要步骤1:画递归树。步骤二:根据自己画的递归树编码。

下面画出示例1的递归树:

思考如何根据这棵递归树编码:

1.每一个结点表示剩余没有扫描到的字符串,产生分支是截取了剩余字符串的前缀;

2.产生前缀字符串的时候,判断前缀字符串是否是回文。

如果前缀字符串是回文,则可以产生分支和结点;
如果前缀字符串不是回文,则不产生分支和结点,这一步是剪枝操作。
3.在叶子结点是空字符串的时候结算,此时从根结点到叶子结点的路径,就是结果集里的一个结果,使用深度优先遍历,记录下所有可能的结果。

采用一个路径变量 path 搜索,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值