定长滑入滑出窗口


    #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]。

例如:

posted @ 2025-06-03 18:23  崩溃的小孙  阅读(12)  评论(0)    收藏  举报