给你一个字符串s,请你将s分割成一些子串,使每个子串都是 回文串 。返回s所有可能的分割方案。
思路
- 画出递归树,可以看出这题和子集题很像,只是对象变成了加分割位置;
2. 这题多了回文的判断条件,我们只需在递归的时候同时看左右是否都是回文的:
- 使用res_i来存储左边分割结果,result来存储全局结果。
- 左边是回文,继续递归;不是回文,停止递归。
- 右边是回文串,意味着找到了一个分割结果,加入result。不管右边字串是否是回文串,都要继续递归。
代码
class Solution(object):
def partition(self, s):
"""
:type s: str
:rtype: List[List[str]]
"""
length = len(s)
def dfs(left):
s2 = s[left:]
#看此时右边所有字符是否是回文
if s2 and s2 == s2[::-1]:
res_i.append(s2)
result.append(res_i[:])
#注意此处res_i要删去右边子串
res_i.pop()
for i in range(left,length):
#实则是s1[left...i]
s1 = s[left:i+1]
#剪枝,如果左边不符合,就不用递归下去
if s1 != s1[::-1]:
continue
#res_i用于存储左边已经划分过的所有回文子串
res_i.append(s1)
#下一次划分位置一定是从下一个元素开始,所以是i+1
dfs(i+1)
res_i.pop()
result = list()
res_i = list()
dfs(0)
return result