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
change大于等于k时,那后面的字符串都变不了了吗
点赞 回复 分享
发布于 2020-02-04 19:13
后面为什么s【L】不是a l就加加?
点赞 回复 分享
发布于 2020-02-05 15:04
else{ while (L <= R && s[L] != a) L++; L++; R++; } 这一串代码我着实没看懂
点赞 回复 分享
发布于 2020-02-05 17:52
学习大佬的代码挺好,但是(我是杠精,别喷我),那个r++;应该可以直接写在for循环里,不用写三遍的(可能大佬比赛着急没想那么多)。
点赞 回复 分享
发布于 2020-02-06 19:26

相关推荐

挣K存W养DOG:他真的很中意你,为什么不回他
点赞 评论 收藏
分享
评论
18
收藏
分享
牛客网
牛客企业服务