华为OD机试(C卷,100分)- 最长的指定瑕疵度的元音子串

(C卷,100分)- 最长的指定瑕疵度的元音子串

题目描述

开头和结尾都是元音字母(aeiouAEIOU)的字符串为元音字符串,其中混杂的非元音字母数量为其瑕疵度。比如:
“a” 、 “aa”是元音字符串,其瑕疵度都为0
“aiur”不是元音字符串(结尾不是元音字符)
“abira”是元音字符串,其瑕疵度为2
给定一个字符串,请找出指定瑕疵度的最长元音字符子串,并输出其长度,如果找不到满足条件的元音字符子串,输出0。
子串:字符串中任意个连续的字符组成的子序列称为该字符串的子串。

输入描述

首行输入是一个整数,表示预期的瑕疵度flaw,取值范围[0, 65535]。
接下来一行是一个仅由字符a-z和A-Z组成的字符串,字符串长度(0, 65535]。

输出描述

输出为一个整数,代表满足条件的元音字符子串的长度。
用例
输入 0
asdbuiodevauufgh
输出 3
说明 无

输入 2
aeueo
输出 0
说明 无

题目解析

在这里插入图片描述
瑕疵度计算规则如上图注解所示。
当两指针之间划定的子串的瑕疵度diff 大于 指定的瑕疵度flaw时,则左指针 l++
当两指针之间划定的子串的瑕疵度diff 小于 指定的瑕疵度flaw时,则右指针 r++
当两指针之间划定的子串的瑕疵度diff 等于 指定的瑕疵度flaw时,则记录当前子串长度,并r++
按以上逻辑,直到r指针移动到idxs数组的尾部。
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 65535
#define MAX(a,b) a>b?a:b
int main()
{
    int flaw;
     scanf("%d",&flaw);
    char s[MAX_LEN];
    scanf("%s",s);
    char* yuan="aeiouAEIOU";
    int idxs[MAX_LEN];
    int idx_size=0;
    int i=0;
    while(s[i]!='\0'){
     if(strchr(yuan,s[i])!=NULL){
          idxs[idx_size++]=i;//存储元音字母在原字符串的下标
     }
       i++;
    }
    int ans=0;
    int n=idx_size;//元音字符串长度
    int l=0;
    int r=0;
    while(r<n){
     int diff=idxs[r]-idxs[l]-(r-l);//当前瑕疵度=原始字符串长度-元音字符串长度
     if(diff>flaw)
          l++;
     else if(diff<flaw)
          r++;
     else{
          ans=MAX(ans,idxs[r]-idxs[l]+1);
          r++;
     }
    }
    printf("%d\n",ans);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不会起名字呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值