Medium草稿★★★★★O(n) 時間 · O(1) 空間
Sliding WindowString
Patterns🪟 滑動視窗
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

1456Maximum Number of Vowels in a Substring of Given LengthSliding WindowMediumSliding Window

給定字串 s 和整數 k,回傳長度為 k 的子字串中,母音字母(a, e, i, o, u)數量的最大值。

Example:

Input: s = “abciiidef”, k = 3 Output: 3(子字串 “iii” 有 3 個母音)

Intuition

TIP

核心思路:固定大小為 k 的滑動視窗,維護視窗內的母音計數,每次移動時更新計數。

Approaches

1. Brute Force — O(n * k) / O(1)
  • Idea: 計算每個長度為 k 的子字串中母音數量
  • Time: O(n * k) - 每個子字串掃描 k 個字元
  • Space: O(1)
Brute Force Code
class Solution {
    fun maxVowels(s: String, k: Int): Int {
        val vowels = setOf('a', 'e', 'i', 'o', 'u')
        var result = 0
        for (i in 0..s.length - k) {
            var count = 0
            for (j in i until i + k) {
                if (s[j] in vowels) count++
            }
            result = maxOf(result, count)
        }
        return result
    }
}
⭐ 2. Fixed Sliding Window — O(n) / O(1)
  • Idea: 維護大小為 k 的視窗,追蹤母音計數,每步 O(1) 更新
  • Time: O(n) - 一次遍歷
  • Space: O(1)
class Solution {
    fun maxVowels(s: String, k: Int): Int {
        val vowels = setOf('a', 'e', 'i', 'o', 'u')
        var count = 0
        var result = 0

        for (i in s.indices) {
            if (s[i] in vowels) count++
            if (i >= k && s[i - k] in vowels) count--
            if (i >= k - 1) result = maxOf(result, count)
        }
        return result
    }
}

WARNING

判斷母音用 Set 查表比多個 || 條件更清晰、效能相當。

🔑 Takeaways