AlgoMooc
你已开通华为OD训练营权益,还差最后一步——完成入营激活(兑换课程 + 加飞书 + 登记服务群),即可解锁全部课程与专属服务。去激活 →
← 返回题库

K0048. 魔法世界的内存释放术

中等通过率 54% · 提交 112 · 通过 61
滑动窗口双指针字符串

小慕正在管理一个由魔法水晶块组成的“内存之域”,这些水晶块被划分为若干个 相同大小 的区块。每个区块要么是空闲的,可以注入魔力,要么已经被其他项目占用。 小慕用一串字符 `` 来记录每个水晶块的状态,其中: - `'.'` 表示该水晶块是空闲的; - `'x'` 表示该水晶块已被占用(所有占用统一用 `x` 表示); 小慕拥有释放魔法的能力,他最多可以释放其中 `` 个被占用的水晶块,使它们变为空闲状态(即 `'x'` 变成 `'.'`)。 现在,他希望通过最多释放 `cnt` 个水晶块,获得一段 的最大长度的水晶块区域。 你的任务是帮助小慕计算,在最优释放方案下,最多能获得多少块连续空闲的水晶。

提示:带虚线的词点一下有通俗解释。

输入描述

输入包含两行: 第一行一个字符串 `memory`,表示初始的水晶块状态,仅包含字符 `'.'` 和 `'x'`,字符串长度满足 `1 <= len(memory) <= 10^5`。 第二行一个整数 `cnt`,表示最多可以释放的水晶块数,满足 `0 <= cnt <= len(memory)`。

输出描述

输出一个整数,表示通过最多释放 `cnt` 块被占用的水晶后,可以获得的最长连续空闲魔法水晶块数量。

示例

示例 1

输入

..x..x..xx...
2

输出

8

说明:对字符串 `memory = "..x..x..xx..."`: - 若释放第 3 和第 6 个水晶块(即将 `memory[2]` 与 `memory[5]` 从 `'x'` 变为 `'.'`), 则得到从 `memory[0]` 到 `memory[7]` 的连续空闲区域,总长度为 `8`。 - 其他释放方式所得最大连续空闲长度都不超过 `8`。 因此输出为 `8`。

时间限制 1000 ms · 内存限制 128 MB

看不懂题目?点开图解
..x..x..xx.............xx.....释放前:..x..x..xx...释放第3和第6个x后:........xx...连续空闲长度 = 8
写完代码点「提交」,将对全部测试用例判题。

向老师提问

针对「魔法世界的内存释放术」把疑问、代码和报错填清楚,老师收到后能更快、更准地回复你。