本题要求最少分割次数,首先要列出子序列是否为回文串的表,可以通过dp或者记忆化实现。之后要定义子结构,我们可以发现,当新字母来了时,我们要考虑有没有新的回文串,所以只要枚举所有新的回文串,再和dp数组加起来作比较即可。
class Solution:
def minCut(self, s: str) -> int:
@cache
def dfs(i, j):
if i >= j: return 1
if s[i] == s[j]: return dfs(i+1, j-1)
else: return 0
dp = [3000 for _ in s]
for i, c in enumerate(s):
if dfs(0, i):
dp[i] = 0
continue
for j in range(1, i+1):
if dfs(j, i) and dp[i] > dp[j-1]+1:
dp[i] = dp[j-1] + 1
dfs.cache_clear()
return dp[-1]