题目:
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
一开始的思路跟题解第二种方法很像:记录出每个区间是否回文+DFS
但是在实现的时候有一个细节没想好:
for i in range(n):
for j in range(0, i+1):
if i == j:
p[j][i] = True
continue
if s[i] == s[j]:
if i - j <= 2 or p[j+1][i-1]:
p[j][i] = True
这其中的第二个for循环,我一开始写的是for j in range(i, n)
看了题解以后才想到用DP
随后自己写的解答如下:
#!/usr/bin/env python3.6
# _*_coding:utf-8 _*_
# @Time : 2019/10/24 21:21
# @Author : Grey
class Solution:
def partition(self, s: str):
n = len(s)
if n <= 1:
return [s]
p = [[False for _ in range(n)] for _ in range(n)]
for i in range(n):
for j in range(0, i+1):
if i == j:
p[j][i] = True
continue
if s[i] == s[j]:
if i - j <= 2 or p[j+1][i-1]:
p[j][i] = True
res = []
def dfs(x, tmp):
if x == len(s):
res.append(tmp.copy())
return
for i in range(x, len(s)):
if p[x][i]:
tmp.append(s[x:i+1])
dfs(i+1, tmp)
tmp.pop()
else:
continue
return
dfs(0, [])
return res
if __name__ == '__main__':
s = "abbccddcc"
print(Solution.partition("self", s))
另外一种方法是直接用回溯法,在回溯过程中再判断是否回文