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

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,即移进来非元音,移出去非元音,则数目不变

综上,可概括为上式。