Problem
You are given a 0-indexed array of strings words and a 2D array of integers queries.
Each query queries[i] = [lᵢ, rᵢ] asks us to find the number of strings present in the range lᵢ to rᵢ (both inclusive) of words that start and end with a vowel.
Return an array ans of size queries.length, where ans[i] is the answer to the iᵗʰ query.
Note that the vowel letters are 'a', 'e', 'i', 'o', and 'u'.
https://leetcode.com/problems/count-vowel-strings-in-ranges/
Example 1:
Input:
words = ["aba","bcb","ece","aa","e"], queries = [[0,2],[1,4],[1,1]]
Output:[2,3,0]
Explanation: The strings starting and ending with a vowel are"aba","ece","aa"and"e".
The answer to the query[0,2]is 2 (strings"aba"and"ece").
to query[1,4]is 3 (strings"ece","aa","e").
to query[1,1]is 0.
We return[2,3,0].
Example 2:
Input:
words = ["a","e","i"], queries = [[0,2],[0,1],[2,2]]
Output:[3,2,1]
Explanation: Every string satisfies the conditions, so we return[3,2,1].
Constraints:
1 <= words.length <= 10⁵1 <= words[i].length <= 40words[i]consists only of lowercase English letters.sum(words[i].length) <= 3 * 10⁵1 <= queries.length <= 10⁵0 <= lᵢ <= rᵢ < words.length
Test Cases
1 | class Solution: |
1 | import pytest |
Thoughts
先扫描一次 words,定义 dp(i)(0 ≤ i < n)表示 words[:i+1] 中,首尾字母是元音的单词个数。显然如果 words[i] 首尾字母是元音,则 dp(i) = dp(i - 1) + 1,否则 dp(i) = dp(i - 1)。初值 dp(0) 根据 words[0] 首尾字母是否是元音来确定。
这样对于任何一个 query = (l, r),看 words 在区间 [l, r] 内首尾字母是元音的单词个数,根据上边定义的 dp 易知结果为 dp(r) - dp(l - 1)(如果 l = 0 则为 dp(r))。
时间复杂度 O(n + m),空间复杂度 O(n),其中 n、m 分别是 words 和 queries 的长度。
实践中可以给 dp 数组最左边增加一个 0,简化边界处理。
Code
1 | from itertools import accumulate |