题目
给你一个字符串 s
,请你将 s
分割成一些子串,使每个子串都是
回文串
。返回 s
所有可能的分割方案。
示例 1:
输入:s = "aab" 输出:[["a","a","b"],["aa","b"]]
示例 2:
输入:s = "a" 输出:[["a"]]
链接:
思路:
首先是分割字符串,我们拿出几个输出来看看 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()