📅  最后修改于: 2023-12-03 15:21:24.593000             🧑  作者: Mango
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
输入: "aab" 输出:
[
["aa","b"],
["a","a","b"]
]
回溯算法
将字符串从左往右依次截取,判断子串是否为回文字符。
若是回文字符,则将子串加入结果数组中,然后递归截取后面的字符串,将后面截取的子串加入结果数组中,直到整个字符串都被截取完毕,这时就获得了一组结果。
如果当前子串不是回文字符,则直接递归截取后面的字符串。
class Solution:
def partition(self, s: str) -> List[List[str]]:
res = []
path = []
def isPalindrome(left, right):
while left < right:
if s[left] != s[right]:
return False
left += 1
right -= 1
return True
def backtrack(start):
if start == len(s):
res.append(list(path))
return
for i in range(start, len(s)):
if isPalindrome(start, i):
path.append(s[start:i+1])
backtrack(i+1)
path.pop()
backtrack(0)
return res
时间复杂度:O(n×2^n)
最坏情况下,回溯算法需要遍历所有可能的情况,其中有 O(2^n) 个叶节点,每个叶节点需要 O(n) 的时间来复制一组答案,因此总时间复杂度为 O(n×2^n)。
空间复杂度:O(n)
递归栈的深度最大为 n,因此空间复杂度为 O(n)。