绘画
可以从题目最终要求的子串中’C’的个数一定是’P’的一半入手。先初始化res= 0,用来记录答案a的大小。之后遍历原串。在遍历的同时更新记录当前碰到的’C’以及’P’的计数。如果当前遍历到的字符是’P’,判断cntC≥⌊cntP⌋是否成立。如果成立,说明以当前2
的’P’为结尾,满足a·C+2a·P的形式,此时最大的a=⌊cntP⌋,将其与res对比,判断2
是否更新res。如果当前字符是’P’且下一个字符是’C’的话,表示之前的计数已经Out了,将两个计数都置零。这个做法的正确性比较显然,就不再赘述证明了。
除了上述做法外,还有一个比较容易想到的切口,就是可以从缺口入口,即’C’与’P’的边界。从边界出发,可以用二分或者双指针等等做法。除此,还可以用前缀和的思想来做。做法比较多,就不一一阐述了,下方给出的代码是基于第一段的思路。
核心代码