今日题目

https://leetcode.com/problems/count-vowel-strings-in-ranges/description/

解题思路

由于每次查询都需要计算某个区间的总和,而任意区间的求和结果对所有查询而言是固定不变的,因此可以使用前缀和来优化。

解题方法

在一次遍历中,我们可以判断 $words[i]$ 是否为元音字符串。基于此,我们可以构建前缀和数组,用于计算索引 1 到索引 i 之间的元音字符串数量。 因此,当需要计算索引 l 到索引 r 之间的元音字符串数量时,只需用 $num(1\space to\space r) - num(1\space to\space l-1)$ 即可得到结果。

小技巧

在 Python 中,$list[-1]$ 表示列表的最后一个元素。因此,我们可以在前缀和数组末尾额外追加一个 [0],以避免索引越界的问题。

复杂度分析

  • 时间复杂度:$O(k\times N + Q)$,其中 k 为元音字母的数量,N 为 words 的长度,Q 为 queries 的长度。

  • 空间复杂度:$O(N)$,因为我们额外存储了一个新列表。

代码

class Solution:
    def vowelStrings(self, words: List[str], queries: List[List[int]]) -> List[int]:
        sumWords = [0] * (len(words) + 1)
        vowels = set(['a','e','i','o','u'])
        for idx, word in enumerate(words):
            sumWords[idx] = sumWords[idx-1]
            if word[0] in vowels and word[-1] in vowels:
                sumWords[idx] += 1

        ans = []
        for x,y in queries:
            ans.append(sumWords[y] - sumWords[x-1])
        
        return ans