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; }