题目描述:给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。
返回符合要求的 最少分割次数 。
这道题目比较适合使用动态规划求解,判断从s[i:j]
是不是会问可以采用动态规划方程dp[i][j] = dp[i+1][j-1] and s[i] == s[j]
。第一次写的时候求解dp矩阵第一层for循环写成了for i in range(1,n):
后来才知道由于dp[i][j] = dp[i+1][j-1] and s[i]==s[j]
求解dp[i][j]
的时候必须依赖dp[i+1][j-1)
(这个需要注意),因此需要逆序(从n-1到1),而不是从1到n。
接着就是再用一次动态规划,判断从0到i分割几次为为回文串。
class Solution:
def minCut(self, s: str) -> int:
n=len(s)
dp=[[True]*n for _ in range(n)]
for i in range(n-1,-1,-1):
for j in range(i+1,n):
#这样做是为了保证计算dp[i][j]的时候dp[i+1][j]已经被计算出来了
dp[i][j] = dp[i+1][j-1] and s[i]==s[j]
f=[float("inf")]*n
for i in range(n):
if dp[0][i]:
f[i]=0
else:
for j in range(i):
if dp[j+1][i]:
f[i]=min(f[i],f[j]+1)
return f[n-1]