一、Problem
Given a string s and an integer k.Return the maximum number of vowel letters in any substring of s with length k.
Vowel letters in English are (a, e, i, o, u).
Input: s = "abciiidef", k = 3
Output: 3
Explanation: The substring "iii" contains 3 vowel letters.
Constraints:
1 <= s.length <= 10^5
s consists of lowercase English letters.
1 <= k <= s.length
二、Solution
方法一:滑動窗口
最大數據爲 ,不能用 時間去枚舉子串
邏輯不嚴謹代碼:當循環退出時,l = r 會漏掉很多情況,所以 WA 了一發…
class Solution {
public int maxVowels(String s, int k) {
int max = 0, l = 0, r = 0, n = s.length(), win[] = new int[258];
HashSet<Character> st = new HashSet<>();
st.add('a');st.add('e');st.add('i');st.add('o');st.add('u');
int cnt = 0;
while (r < n) {
int cnt = 0;
while (true) {
if (r-l+1 > k)
break;
char cr = s.charAt(r);
if (st.contains(cr)) {
cnt++;
r++;
}
}
max = Math.max(max, cnt);
l = r;
}
return max;
}
}
修正邏輯:
- 窗口的含義
- 囊括長度 >= k 的所有子串
- 窗口右移時機
- 每次都右移
- 窗口左移時機
- 當窗口的大小大於 k 時,證明當前窗口是不合法的,所以就通過縮小窗口來維護長度窗口的大小爲 k
- 結算時機
- 實時記錄元音字符的個數
class Solution {
public int maxVowels(String s, int k) {
int n = s.length(), l = 0, r = 0, cnt = 0, max = 0;
Set<Character> st = new HashSet<>();
st.add('a');st.add('e');st.add('i');st.add('o');st.add('u');
char[] cs = s.toCharArray();
while (r < n) {
while (r-l+1 > k) {
if (st.contains(cs[l]))
cnt--;
l++;
}
if (st.contains(cs[r]))
cnt++;
r++;
max = Math.max(max, cnt);
}
return max;
}
}
複雜度分析
- 時間複雜度:,
- 空間複雜度:,