题目描述
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例:
输入: “aab”
输出: [ [“aa”,“b”], [“a”,“a”,“b”] ]来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-partitioning
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
比起之前的回溯,多了一步判断是否为回文子串。
代码
class Solution:
def partition(self, s: str) -> List[List[str]]:
self.res = []
n = len(s)
def is_valid(tmp_s):
i, j = 0, len(tmp_s)-1
while i <= j:
if tmp_s[i] != tmp_s[j]:
return False
i += 1
j -= 1
return True
def reversive(start, tmp):
if start == n:
self.res.append(tmp[::])
return
for i in range(start, n):
if not is_valid(s[start:i+1]):
continue
tmp.append(s[start:i+1])
reversive(i+1, tmp)
tmp.pop()
reversive(0,[])
return self.res
复杂度分析
- 时间复杂度:O(n*2^n)
- 空间复杂度:O(n),最长的回文子串为字符串的情况