
回文字符串是指:
从左往右读和从右往左读完全一样的字符串。
coffeescript
s == s[::-1]
切片回溯
coffeescript
start=0
├─ "a"
│ ├─ "a"
│ │ └─ "b"
└─ "aa"
└─ "b"
整个递归路径
coffeescript
class Solution:
def partition(self, s: str) -> List[List[str]]:
res = []
n = len(s)
# start 从s的start索引开始切。之前的已经切好了(是回文),剩下的从这里开始切
# tmp 列表,记录了从字符串开头到当前位置,已经切出来的所有回文子串。
def backtrack(start, tmp): # 切片起始位置,待选排列
# 切到末尾 整串已经被成功分割完
if start == n:
res.append(tmp)
return
# 枚举切割位置
for i in range(start, n):
sub = s[start:i+1] # 切片
if sub == sub[::-1]: # 如果当前这段是回文,才允许继续往后切
backtrack(i+1, tmp + [sub]) # 传新列表
backtrack(0, []) # 切片起始位置,字符串
return res
时间复杂度:O(N⋅2N)O(N \cdot 2^N)O(N⋅2N)
字符串有 N−1N-1N−1 个可能的切割位置,每个位置切或不切,共有 2N2^N2N 种分割方式。每次判断回文需要 O(N)O(N)O(N)。
空间复杂度:O(N2)O(N^2)O(N2)
主要是递归栈的深度和存储中间状态。