分割回文串

46 阅读1分钟

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

思路
  1. 画出递归树,可以看出这题和子集题很像,只是对象变成了加分割位置

回文串.drawio.svg
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