分割回文串问题
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博客https://blog.csdn.net/weixin_58649388/article/details/123514694?spm=1001.2014.3001.5502
回溯算法题目分析之组合问题: