nozomi和字符串

nozomi和字符串

http://www.nowcoder.com/questionTerminal/ebc0a750916541909e1e0377051b7e60

图片说明

用尺取法维护一个区间改变k个字符的区间

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>

using namespace std;

string s;
int n, k;

int deal(char a, char a1)// change a to a1
{
    int L = 0, R = 0, change = 0, ans = 1;
    for (int i = 0; i < n; i++){
        if (s[i] == a){
            if (change < k){
                change++;
                R++;
            }
            else{
                while (L <= R && s[L] != a) L++;
                L++;
                R++;
            }
        }
        else R++;
        ans = max(ans, R - L );
    }
    return ans;
}

int main(){
    while (cin >> n >> k){
        cin >> s;
        cout << max(deal('1', '0'), deal('0', '1')) << endl;
    }
}
全部评论
楼上对于代码的问题,我可能懂一点(不保证对,我也挺菜的)。为什么要while (l <= r && s[l] != a) l++;呢?因为此时的change使用的次数已经达到k了,那么下一个数字是要变的数字a。此时需要在这个进行判断,然后如果在这个区间最左端的数字就是a1,那么那么可以无条件缩小区间,反正不会影响change(此时的change就是k),于是乎就有了这句。但是如果区间最左端数字是a的话就不可以(因为change已经等于k了)。而后面的l++; r++;这句则是在change不变的原则下进行的区间平移。因为经过上面的while语句后可以保证区间最左端的数字一定是a,而区间最右端的数字也一定是a。这时,l++(相当于change--),r++(相当于change++),change还是等于k(这应该就是一楼问的问题,change实际上在等于k后一直都是等于k的)。
2 回复 分享
发布于 2020-02-06 19:21
学习大佬的代码挺好,但是(我是杠精,别喷我),那个r++;应该可以直接写在for循环里,不用写三遍的(可能大佬比赛着急没想那么多)。
点赞 回复 分享
发布于 2020-02-06 19:26
else{ while (L <= R && s[L] != a) L++; L++; R++; } 这一串代码我着实没看懂
点赞 回复 分享
发布于 2020-02-05 17:52
后面为什么s【L】不是a l就加加?
点赞 回复 分享
发布于 2020-02-05 15:04
change大于等于k时,那后面的字符串都变不了了吗
点赞 回复 分享
发布于 2020-02-04 19:13

相关推荐

06-26 10:08
门头沟学院 C++
北京Golang实习,一个月4700,吃住都不报,公司位置在海淀。请问友友怎么看呢?如果要租房的话有什么建议吗
码农索隆:租房肯定是合租了,剩下的钱,差不多够正常吃饭了,看看能不能学到东西吧
点赞 评论 收藏
分享
06-20 21:22
已编辑
门头沟学院 Java
纯真的河老师在喝茶:答应了就跑啊,实习随便跑啊,别被pua了,md就是找个廉价劳动力,还平稳过度正式工,到时候跟你说没转正
点赞 评论 收藏
分享
评论
19
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务