最大连续的相同字符的子串的长度

题目描述

有一个仅包含’a’和’b’两种字符的字符串s,长度为n,每次操作可以把一个字符做一次转换(把一个’a’设置为’b’,或者把一个’b’置成’a’);但是操作的次数有上限m,问在有限的操作数范围内,能够得到最大连续的相同字符的子串的长度是多少。

输入描述:

第一行两个整数 n , m (1<=m<=n<=50000),第二行为长度为n且只包含’a’和’b’的字符串s。

输出描述:

输出在操作次数不超过 m 的情况下,能够得到的 最大连续 全’a’子串或全’b’子串的长度。

示例1

输入

8 1 aabaabaa

输出

5

说明

把第一个 'b' 或者第二个 'b' 置成 'a',可得到长度为 5 的全 'a' 子串。

 

类似滑动窗口问题。

滑动窗口用deque,这里用queue,因为不需要和后面加入的数进行比较。

 

#include <algorithm>
#include <queue>
#include <iostream>
#include <string>
using namespace std;

int main()
{
    int n, m;
    cin >> n >> m;
    string str;
    cin >> str;
    //存a ,b的位置
    queue<int> qa;
    queue<int> qb;
    //需要变为a和变为b开始的位置
    int starta = 0;
    int startb = 0;
    //需要变为a变为b的长度
    int ansa = 0;
    int ansb = 0;
    for (int i = 0; i < str.size(); i++)
    {
        if (str[i] == 'a')
        {
            ansa = max(ansa, i - starta + 1);
            if(qa.size() < m)
            {
                qa.push(i);
                ansb = max(ansb, i - startb + 1);
            }
            else
            {
                startb = qa.front() + 1;
                qa.pop();
                qa.push(i);
            }
        }
        else
        {
            ansb = max(ansb, i - startb + 1);
            if (qb.size() < m)
            {
                qb.push(i);
                ansa = max(ansa, i - starta + 1);
            }
            else
            {
                starta = qb.front() + 1;
                qb.pop();
                qb.push(i);
            }
        }
    }
    cout << max(ansa, ansb) << endl;
    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值