每次改变一个字符,要求我们求出最小操作次数,使得原字符串按顺序由连续个 I,连续个 O,连续个 I 组成。
题目解析
其实说白了,就是两个连续的 I 串中间夹了个 O 串。因为数据只有 n \le 5\times 10^3,n^2 为 10^7 级别刚好能过,我们可以考虑直接枚举 O 串的两个端点,对每种方案计算需要修改的字符数量,求最小值即可。
问题来了,怎么在 O(1) 的时间复杂度下计算要修改多少字符呢?因为我们枚举 O 串的两个端点,等于知道了 O 串的范围,进而可以知道在这个范围内 O 的数量,由此还可以推出前面的 I 的数量和后面 I 的数量,所以我们可以记录原字符串的字符在各个位置的数量,以此推导需要修改的字符量,而实现这个操作的最好方法就是前缀和。由于只有两种字符,因此我们记录一个前缀数组即可,另一个可以根据总数推出来。