从一个ab序列中最多改变k个字符找到最长的连续a子串或者b子串长度.【尺取法】

景女神最近一直在恶补英语,她要为了她的托福做准备。于是,满神给景女神出了一道题,来帮助景女神学习英语。
满神给了景女神一个长度为n的字符串,字符串只包含小写字母 a,b;并且告诉景女神她最多可以改变k个字符(a->b, b->a);满神想知道经过不超过k次的改变后,出现相同字母的字符串(连续)的最大长度是多少。
景女神觉得这个题和她记单词并没有什么关系,于是就学英语去了。但是满神希望聪明的你可以帮助他解决这个问题。
Input
多组输入,每组输入如下
第一行输入两个整数n和k,用空格隔开 (1 <= n <= 100000, 0 <= k <= n);
第二行输入一个字符串。(只包含小写字母 a和b);
Output
多组输出,每组输出一个整数,表示经过不超过k次改变后,出现相同字符的最大字符串长度。
Sample Input
4 2
abba
8 1
aabaabaa
Sample Output
4
5

Hint:
第一组样例:可以得到 aaaa 或者 bbbb;最大长度为4;
第二组样例:可以得到 aaaaabaa 或者 aabaaaaa; 最大长度的字符串是 aaaaa,长度为5;

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

代码;

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define MST(s,q) memset(s,q,sizeof(s))
#define INF 0x3f3f3f3f
#define MAXN 1005
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('a', 'b'), deal('b', 'a')) << endl;
    }
}

你可能感兴趣的:(尺取法)