该题解采用动态规划的方法来解决问题。首先预处理出任意区间[i, j]转变成回文串所需的最小修改次数,存储在二维数组ss中。接着定义状态f[i][j]表示将字符串的前j个字符分割成i个回文子串所需的最小修改次数。状态转移方程是通过枚举上一个回文子串的结尾位置l来更新,即f[i][j] = min(f[i-1][l] + ss[l][j-1]),其中l从i-1到j-1遍历。最终答案为f[k][n],即整个字符串分割成k个回文子串的最小修改次数。
时间复杂度: O(n^3 + k*n^2)
空间复杂度: O(n^2 + k*n)
class Solution:
def palindromePartition(self, s: str, k: int) -> int:
n = len(s)
# 预处理数组,计算任意子串成为回文串的最小修改次数
ss = [[0] * n for _ in range(n)]
for i in range(2, n + 1):
for j in range(n - i + 1):
ss[j][j+i-1] = ss[j + 1][j+i-2] + (0 if s[j] == s[j+i-1] else 1)
# 动态规划数组,记录分割成i个回文子串的最小修改次数
f = [[float('inf')] * (n+1) for _ in range(k+1)]
f[0][0] = 0 # 初始化状态
for i in range(1, k + 1):
for j in range(i, n+1-(k-i)):
if i == 1:
f[i][j] = ss[0][j-1] # 只有一个分组时直接取整个字符串为一组的情况
else:
for l in range(i-1, j):
f[i][j] = min(f[i-1][l] + ss[l][j-1], f[i][j])
return f[k][n]