定长滑入滑出窗口
#define max(a,b) ((b)>(a)?(b):(a))
int isVowel(char c){
return c=='a'||c=='e'||c=='i'||c=='o'||c=='u';
}
int maxVowels(char* s, int k) {
int count=0,ans=0,n=strlen(s);//比较一个子串中最大元音数
for(int i=0;i<k&&i<n;i++)//要小于字符串长度
{
if(isVowel(s[i]))
count++;//检测前k-1元音个数
}
ans=count;
for(int j=1;j<=n-k;j++)
{
if(isVowel(s[j+k-1]))
count++;//检测滑入的是否为元音,此时为k个元素的子串的元音数,此时i为k若i++会让s【i】溢出。
if(isVowel(s[j-1]))
count--;//检测滑出的是否为元音
ans=max(ans,count);
}
return ans;
}
窗口滑动逻辑容易错误,导致窗口长度逐渐增加,而不是保持k。
循环条件错误,导致i超过字符串长度,访问越界。
修改方法:
将第二个循环的结构改为正确的滑动窗口,例如,右端i从k到n-1,左端j = i -k +1。或者,使用一个循环,每次处理窗口右移一位,左端j从0开始,到n -k结束,每次处理窗口[j, j +k -1]。
例如:

浙公网安备 33010602011771号