首页 > 试题广场 >

穷哈哈~

[编程题]穷哈哈~
  • 热度指数:13095 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
"你叉叉,唱日出,穷哈哈,唱日落.....",小哈开心地哼着小调,因此小哈是一个爱笑的人,每次笑都很有魔性,调皮地小哼记录了小哈的一次说的话,其中里面可能包含了小哈的笑声,并以为字符串来记录小哈的话。已知,小哈的笑声是字母交替的序列,例如:,,是符合笑声的合法序列。但是,,不符合笑声的合法序列。
通过小哼的记录,请你求出小哈笑声的最大长度。

输入描述:
输入的第一行给出小哈说话的长度
随后一行中输入一行长度为字符串——表示小哈的话。
{1 \leq N \leq 10^5}
仅由小写字母组成。


输出描述:
输出小哈笑声的最大长度。
示例1

输入

7
abacaba

输出

1
示例2

输入

20
ahahahahahahahahahah

输出

20
#include <stdio.h>
#include<string.h>
int main(){
   int N;
   scanf("%d",&N);
   getchar();
   char s[100001];
   fgets(s,sizeof(s),stdin);
   s[strcspn(s,"\n")]='\0';
   int left=0,max=1,k;
   int n;
    for(n=0;n<N;n++){
        if(s[n]=='a'||s[n]=='h')
        {
             break;
        }
    }
    if(n==N)
    {
      k=0;
      printf("%d",k);
      return 0;
    }
    else
    {
      k=1;
      while(left<N-1)
      {  
          while(left<N-1&&(s[left]=='a'&&s[left+1]=='h'||s[left]=='h'&&s[left+1]=='a'))
          {
              k+=1;
              left+=1;
          }
          if(k>max)
          {
            max=k;
          }
          k=1;
          left+=1;
      }
    }
    printf("%d",max);
}
发表于 今天 11:52:27 回复(0)
这是递归吗
#include <stdio.h>

int la(int* sum,int*max);
int lh(int* sum,int*max){
    char str;
    if(scanf("%c",&str)!=EOF&&str=='a'){
        *sum+=1;
        la(sum,max);
    }
    else{
        //处理连续h的情况,防止因为偶数个h连续,导致ah计数丢失
        if(str=='h'){
            //在重置计数前,先保存目前的最大长度,防止丢失
            if(*sum>*max){
                *max=*sum;
            }
            *sum=1;
            lh(sum,max);
        }
        if(*sum>*max){
            *max=*sum;
        }
        *sum=0;
    }
    return 0;
}
int main() {
    char s;
    int i=0,j=0,k;
    int* sum=&i;
    int*max=&j;
    scanf("%d",&k);
    for(;scanf("%c",&s)!=EOF;){
        if(s=='a'){
            i+=1;
            la(sum,max);
        }
        if(s=='h'){
            i+=1;
            lh(sum,max);
        }
    }
    printf("%d",j);
    return 0;
}

int la(int*sum,int*max){
    char str;
    if(scanf("%c",&str)!=EOF&&str=='h'){
        *sum+=1;
        lh(sum,max);
    }
    else{
        if(str=='a'){
            if(*sum>*max){
                *max=*sum;
            }
            *sum=1;
            la(sum,max);
           
        }
        if(*sum>*max){
            *max=*sum;
        }
        *sum=0;
    }
    return 0;
}

发表于 2026-01-09 23:49:58 回复(0)
#include <stdio.h>
#include <stdlib.h>
void clear(void);
int count_max(char*);
int main() {
    int len;//获得长度
    scanf("%d",&len);
    char *str=calloc(len+1,sizeof(char));//内存分配
    if(!str)
        exit(EXIT_FAILURE);
    clear();//清理缓存区
    scanf("%s",str);
    printf("%d\n",count_max(str));
    free(str);//避免内存泄漏
    return 0;
}
void clear(void)
{
    int ch;
    while((ch=getchar())!='\n'&&ch!=EOF);
}
int count_max(char*str)
{
    int max=0;//用一个变量统计最终的最大值
    int flag;//使用flag记录当前状态(为一则上次录入a,为零则上次录入h)
    int i=0;
    int current_max=0;//使用中间变量随时统计长度
    for(;str[i]!='\0';i++){//利用一个循环确定初始flag
        if(str[i]=='a'){
            flag=1;
            current_max++;
        }
        else if(str[i]=='h'){
            flag=0;
            current_max++;
        }
        else;
        if(current_max>max){//初始flag已确立,移动下标后退出循环
            max=current_max;
            i++;
            break;
        }
    }
    for(;str[i]!='\0';i++){//在上个循环基础上遍历数组
        if(str[i]=='a'&&flag!=1){
            current_max++;
            flag=1;//状态转换
        }
        else if(str[i]=='h'&&flag!=0){
            current_max++;
            flag=0;//状态转换
        }
        else if(str[i]=='a'||str[i]=='h')
                current_max=1;//持续出现aa或hh
        else {
            current_max=0;//出现其他字符
        }
        if(current_max>max)
            max=current_max;//比较更新max
    }
    return max;//返回最终值
}

发表于 2026-01-06 21:29:52 回复(0)