给你字符串 s
和整数 k
。
请返回字符串 s
中长度为 k
的单个子字符串中可能包含的最大元音字母数。
英文中的 元音字母 为(a
, e
, i
, o
, u
)。
1、暴力
直接暴力枚举所有子串并且比对每一个字串中的字符是否为元音字母,很明显这样的时间复杂度高,太慢了
2、滑动窗口
我们在字符串s中选取k个字符逐一比对并且记录下当前最大元音字母数,在暴力中我们需要前移动一个字符并且从头比对起,但是很明显我们可以只去比对移动后新增的字符是否为元音字母,若为元音字母,则最大元音字母数+1,注意在移动的过程中我们移开的那个字符也应该再比对一次若为元音字母,则最大元音字母数-1。
class Solution {
public int maxVowels(String s, int k) {
//将字符串复制到字符数组中
char[] input = s.toCharArray();
//当前窗口中元音字母数
int sum = 0;
//最大元音字母数
int answer = 0;
//循环数组中每一个字符
for (int i = 0; i < input.length; i++) {
//判断是否为元音字母
if (is(input[i])) {
sum++;
}
//判断窗口大小,若没检查完整个窗口则跳过后面继续检查
if (i < k - 1) {
continue;
}
//检查完窗口所有字符后更新答案
answer = answer > sum ? answer : sum;
//判断移开的字符是否为元音
if (is(input[i - k + 1])) {
sum--;
}
}
return answer;
}
//判断元音
public boolean is(char c) {
return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
}
}