列表

详情


ZJ3. 编程题2

描述

有一个仅包含’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' 子串。

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 380KB, 提交时间: 2020-08-21

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n , m, i;
    int len = 0;
    scanf("%d %d", &n , &m);
    char* str = (char*)malloc(n+1);
    scanf("%s",str);
    
    int left = 0;
    int right = 0; 
    int an = 0;
    int bn = 0;

    int res = 0;
    int tmp = 0;
   // printf("\r\n %c ", ch);
    
    while(right <= n){
        if(str[right] == 'a') {
            an++;
        } else {
            bn++;
        }
        
        if(an <=m ||bn<=m) {
            right++;
        } else {
            tmp = right -left;
            res = res>tmp?res:tmp;
            if(str[left] == 'a'){
                left++;
                an--;
            } else {
                left++;
                bn--;
            }
            right++;
        }
    }
    tmp = right -left;
    res = res>tmp?res:tmp;
    printf("%d", res);
    
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 440KB, 提交时间: 2020-10-11

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n , m, i;
    int len = 0;
    scanf("%d %d", &n , &m);
    char* str = (char*)malloc(n+1);
    scanf("%s",str);
    
    int left = 0;
    int right = 0; 
    int an = 0;
    int bn = 0;

    int res = 0;
    int tmp = 0;
   // printf("\r\n %c ", ch);
    
    while(right <= n){
        if(str[right] == 'a') {
            an++;
        } else {
            bn++;
        }
        
        if(an <=m ||bn<=m) {
            right++;
        } else {
            tmp = right -left;
            res = res>tmp?res:tmp;
            if(str[left] == 'a'){
                left++;
                an--;
            } else {
                left++;
                bn--;
            }
            right++;
        }
    }
    tmp = right -left;
    res = res>tmp?res:tmp;
    printf("%d", res);
    
    return 0;
}

C 解法, 执行用时: 3ms, 内存消耗: 384KB, 提交时间: 2021-08-04

#include <stdio.h>
#include <stdlib.h>
 
int n=0,m=0,cnt=0;
char a[50005]={0};
 
inline void worm(char c)
{
    int num=0,head=0,tail=0,len=1;
    for(head=0;a[head];head++,len++){
        if(a[head]==c) num++;
        if(num>m){
            while(a[tail]-c) tail++,len--;
            tail+=1,len--,num--;
        }
        cnt=cnt>len?cnt:len;
    }
}
 
int main()
{
    scanf("%d %d %s",&n,&m,a);
    worm('a');
    worm('b');
    printf("%d\n",cnt);
    return 0;
}

C 解法, 执行用时: 3ms, 内存消耗: 440KB, 提交时间: 2020-08-05

#include <stdio.h>
#include <stdlib.h>

int max(int x, int y)
{
    return (x > y ? x : y);
}

int main(){
    char c[50001];
    int n, m;
    scanf("%d%d", &n, &m);
    for(int i=0;i<n;i++) scanf("%c", &c[i]);
    int maxl=0, l=0, r=0, an=0, bn=0;
    while(r<=n){
        if(c[r]=='a') an++;
        else bn++;
        if(an<=m||bn<=m){
            r++;
        }else{
            if((r-l)>maxl) maxl=r-l;
            if(c[l]=='a'){
                l++;
                an--;
            }else{
                l++;
                bn--;
            }
            r++;
        }
    }
    if((r-l)>maxl) maxl=r-l;
    printf("%d", maxl);
    return 0;
}

C++ 解法, 执行用时: 3ms, 内存消耗: 476KB, 提交时间: 2020-08-08

#include <iostream>
#include <cstdio>
using namespace std;

int main() {
    int n,m;
    char input[50001];
    scanf("%d%d", &n, &m);
    scanf("%s", input);
    int ca = 0;
    int cb = 0;
    int left = 0;
    int ans = 0;
    //cout << n << m << input << endl;
    for (int i = 0; i < n; i++) {
        if (input[i] == 'a') {
            ca++;
        }
        if (input[i] == 'b') {
            cb++;
        }
        while (ca > m && cb > m) {
            if (input[left++] == 'a') {
                ca--;
            } else {
                cb--;
            }
        }
        ans = max(ans, ca + cb);
    }
    cout << ans << endl;
    return 0;
}

上一题