1456. 定长子串中元音的最大数目(原始暴力匹配法以及滑动窗口法)

文章对比了两种解决在给定字符串中找到具有最多元音的长度为k子串的方法。暴力求解法的时间复杂度为O(k·n),而采用滑动窗口方法可以降低到O(n)。滑动窗口方法中,cur_vowel变量更新反映了新进入和移出字符对元音总数的影响,确保高效计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.暴力求解

class Solution {

public:
    int maxVowels(string s, int k) {
        int maxVowels = 0;
        for(int i = 0;i<s.size();i++){
            if(i+k > s.size())  return maxVowels;
            string cur_str = s.substr(i,k);
            maxVowels = max(countVowel(cur_str),maxVowels);
        }
        return maxVowels;
    }
    int countVowel(string str){
        int vowel_num = 0;
        for(int i = 0;i < str.size();i++){
            switch(str[i]){
                case 'a':
                case 'e':
                case 'i':
                case 'o':
                case 'u':
                    vowel_num +=1;
            }
        }
        return vowel_num;
    }
};

最后求解后时间复杂度为:
O(k⋅n) O(k·n)O(kn)

2.采用滑动窗口方法

class Solution {

public:
    int maxVowels(string s, int k) {
        int cur_vowel = 0;
   
        for(int i =0;i < k;i++){
            cur_vowel += isVowel(s[i]);
        }
        int res = cur_vowel;
        for(int i = k;i<s.size();i++){
            cur_vowel += isVowel(s[i]) - isVowel(s[i-k]);
            res = max(cur_vowel,res);
        }
        return res;
    }
    bool isVowel(char& c){
        return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
    }
};

时间复杂度:
O(n)O(n) O(n)

 cur_vowel += isVowel(s[i]) - isVowel(s[i-k]);

这一步的含义是:
向右滑动一格后(即i++后),考虑s[i](表示移进来的一格),s[i-k](移出的一格),可分为以下情况:

  1. 如果s[i] == 1(即s[i] 为元音),s[i-k]也为元音,则 元音增加数目为0
  2. 如果s[i] == 1,s[i-k] == 0,即移进来元音,移出去非元音,则数目+1
  3. 如果s[i] == 0,s[i-k] == 1 ,即移进来非元音,移出去元音,则数目-1
  4. 如果s[i] == 0,s[i-k] == 0,即移进来非元音,移出去非元音,则数目不变

综上,可概括为上式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值