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