131. 分割回文串
class Solution:
def partition(self, s: str) -> List[List[str]]:
# 总体思路:动态规划预处理 + 回溯搜索
n = len(s)
# 动态规划预处理 f[i][j]
f = [[True]*n for _ in range(n)]
for j in range(0,n):
for i in range(0,j):
if i==j:
f[i][j] = True
else:
f[i][j] = f[i+1][j-1] and (s[i] == s[j])
# 回溯搜索
def dfs(x):
if x == n:
ret.append(ans[:])
return
for i in range(x,n):
if f[x][i]:
ans.append(s[x:i+1])
dfs(i+1)
ans.pop()
ret = []
ans = []
dfs(0)
return ret
[总结]
思路:先做动态规划预处理得到状态表f(免于重复计算),再基于状态表f进行深度搜索
1. 注意动态规划状态表的遍历顺序以及初始设置!
2. 列表的深拷贝: ans[:]
3. 注意递归需要有终止条件!