package
0.0.0-20241220224003-b7cf03a90b2b
Repository: https://github.com/szhou12/leetcode-go.git
Documentation: pkg.go.dev
# README
2911. Minimum Changes to Make K Semi-palindromes
Solution idea
DP
思路总结
- DP 典型类型题 - 切绳子: 一个大字符串,分成 k 个区间,要求每个区间满足一些条件,求整体的一个最优规划。
- Definition:
dp[i][p]
= minimun number of changes in makes[0:i]
(inclusive) so it has p semi-palindrome substrings.- 怎么回头看?
X X X j [X X i]
前 j 个元素分成 p-1 个区间所需最小变动 (for allj < i
) +[X X i]
当前这段区间所需最小变动
- 怎么回头看?
- Definition:
// Recurrence 模版
for i := 0; i < n; i++ {
for p := 2; p <= k; p++ { // 注意:这里 p 从2开始。p=1 表示一整个大区间,不做任何分割。p=0 没有意义。
dp[i][p] = math.MaxInt / 2
for j := 0; j < i; j++ {
dp[i][p] = min(dp[i][p], dp[j][p-1]+cost[j+1][i])
}
}
}
return dp[n-1][k]
- 啥是 semi-palindrome?
- 数学描述: A string with a length of
len
is considered a semi-palindrome if there exists a positive integerd
such that1 <= d < len
andlen % d == 0
, and if we take indices that have the same modulo byd
, they form a palindrome. - 例子:
"adbgad"
is a semi-palindrome
0 1 2 3 4 5 a d b g a d (len = 6) %1 0 0 0 0 0 0 (abdgad) %2 0 1 0 1 0 1 (aba, dgd) <- semi-palindrome | | | | | | a | b | a | d g d %3 0 1 2 0 1 2 (ag, da, bd) %4 0 1 2 3 0 1 (aa, dd, b, g) <- invalid! 6%4 != 0 %5 0 1 2 3 4 5 (a, d, b, g, a, d) <- invalid! 6%5 != 0
- 数学描述: A string with a length of
Time Complexity = $O(n^3 + n^3) = O(n^3)$
Resource
【每日一题】LeetCode 2911. Minimum Changes to Make K Semi-palindromes