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(k⋅n)
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]
(移出的一格),可分为以下情况:
- 如果
s[i]
== 1(即s[i]
为元音),s[i-k]
也为元音,则 元音增加数目为0 - 如果
s[i]
== 1,s[i-k]
== 0,即移进来元音,移出去非元音,则数目+1 - 如果
s[i]
== 0,s[i-k]
== 1 ,即移进来非元音,移出去元音,则数目-1 - 如果
s[i]
== 0,s[i-k]
== 0,即移进来非元音,移出去非元音,则数目不变
综上,可概括为上式。