【字符串】B047_LC_定長子串中元音的最大數目(滑動窗口)

一、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

方法一:滑動窗口

最大數據爲 10510^5,不能用 O(n2)O(n^2) 時間去枚舉子串

邏輯不嚴謹代碼:當循環退出時,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;
    }
}

複雜度分析

  • 時間複雜度:O(n)O(n)
  • 空間複雜度:O(1)O(1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章