思路:
目标是让字符串 包含子串 "AcMer"。
子串长度是 5,所以我们只需要:
枚举所有长度为 5 的连续区间
计算把这个区间改成 "AcMer" 的总代价
取最小值
1) 窗口枚举范围写错了
你写的是:
for i := 0; i < n-5; i++ {
但长度为 5 的窗口起点 i 应该满足 i+5 <= n,所以:
正确:i <= n-5
因为“子串”要求 连续,而 "AcMer" 长度是 5,所以它在原串里出现时,一定对应原串中某一段连续的 5 个字符。
假设原串是 s,如果它包含 "AcMer",那就一定存在某个起点 i,满足:
s[i] 对应 'A'
s[i+1] 对应 'c'
s[i+2] 对应 'M'
s[i+3] 对应 'e'
s[i+4] 对应 'r'
这 5 个位置就是一个“窗口”。
所以我们才枚举所有可能的 i,把这段长度为 5 的连续片段改成 "AcMer",取代价最小的那一次。
为什么窗口起点范围是 0 .. n-5?
因为窗口长度是 5,起点是 i,最后一个字符下标是 i+4,不能越界:
最大下标是 n-1
所以 i+4 <= n-1
得到 i <= n-5
因此 i 可以取到 n-5(包含),这就是最后一个合法窗口。
举例 n=6:
i=0 看 0..4
i=1 看 1..5(最后一个合法窗口,不能漏)

4954

被折叠的 条评论
为什么被折叠?



