ACMER

思路:
目标是让字符串 包含子串 "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(最后一个合法窗口,不能漏)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值