题解/算法 {3144. 分割字符频率相等的最少子字符串}
@LINK: https://leetcode.cn/problems/minimum-substring-partition-of-equal-character-frequency/
;
很容易想到: DP[i]: 将[0...i]分割的最小个数
, 然后枚举j
, 如果[j+1,...i]
是合法的, 那么更新DP[j]+1 -> DP[i]
; (实际上 这就是答案…)
但是, 此时你可能会陷入深深的自我怀疑中, 假如DP[j]
的最后一组 她可以和当前组[j+1,...i]
混合到一起, 也就是应该用DP[j] + 0 -> DP[i]
; (比如DP[j] = {..., ab}, 当前是{ab}
, 那么显然{..., ab, ab}
她不是最优的 而是{..., aabb}
是最优的;
.
于是你想着, 那DP里还得记录 最后一组的方案, 这就把问题指数级复杂化了… 因为a, bb
不能合并, aa, bb
可以合并, 你要记录具体方案的话 太多了…
首先, 你要理解 DP的本质; 在本题中, 答案是DP[N-1]
(即你DP的定义是没问题的), 然后使用前驱递推方式, 要保证DP[N-1]
的正确性, 也就是 要保证 你的DP转移是没问题的;
虽然说 {...,ab} + {ab}
此时你得到{...,ab,ab}
这确实不是最优解, 但是 DP转移 就是这样定义的 (DP转移是规定死了的 他不负责最优性), 也就是虽然她不是最优解 即{...,ab,ab}
你可以认为她是错误转移, 但是 不要忘记 你的目的只有1个 就是保证DP[N-1]
的正确性 只要他正确了就可以, 存在错误的DP转移没问题, 因为当{...,ab,ab}
时, 你一定会找到一个jj
即jj = {...}
此时{...} + {abab}
他是正确的; 也就是 存在错误的DP转移没问题, 只要有1个正确的 换句话说 你只要保证DP[i]
最终的正确性 即可;