2559.统计范围内的元音字符串数:前缀和

【LetMeFly】2559.统计范围内的元音字符串数

力扣题目链接:https://leetcode.cn/problems/count-vowel-strings-in-ranges/

给你一个下标从 0 开始的字符串数组 words 以及一个二维整数数组 queries

每个查询 queries[i] = [li, ri] 会要求我们统计在 words 中下标在 liri 范围内(包含 这两个值)并且以元音开头和结尾的字符串的数目。

返回一个整数数组,其中数组的第 i 个元素对应第 i 个查询的答案。

注意:元音字母是 'a''e''i''o''u'

 

示例 1:

输入:words = ["aba","bcb","ece","aa","e"], queries = [[0,2],[1,4],[1,1]]
输出:[2,3,0]
解释:以元音开头和结尾的字符串是 "aba"、"ece"、"aa" 和 "e" 。
查询 [0,2] 结果为 2(字符串 "aba" 和 "ece")。
查询 [1,4] 结果为 3(字符串 "ece"、"aa"、"e")。
查询 [1,1] 结果为 0 。
返回结果 [2,3,0] 。

示例 2:

输入:words = ["a","e","i"], queries = [[0,2],[0,1],[2,2]]
输出:[3,2,1]
解释:每个字符串都满足这一条件,所以返回 [3,2,1] 。

 

提示:

  • 1 <= words.length <= 105
  • 1 <= words[i].length <= 40
  • words[i] 仅由小写英文字母组成
  • sum(words[i].length) <= 3 * 105
  • 1 <= queries.length <= 105
  • 0 <= queries[j][0] <= queries[j][1] < words.length

方法一:前缀和

这道题说白了就是给出多次询问,每次问你第l到第r个单词中,有多少个单词的首字母和尾字母都是元音字母。

暴力求解肯定会超时,因此这就需要使用一个技巧,叫“前缀和”。

假设words中有n个单词,那么我们创建一个长度为n+1的数组prefix,prefix[0] = 0。

令$prefix[i + 1]$代表words的下标0到i的单词中首尾都是元音字母的单词个数

那么$prefix[r + 1] - prefix[l]$就是words的l到r中首尾都是元音字母的单词个数

并且prefix[i + 1]可以由prefix[i]和words[i]很轻松地得到。

  • 时间复杂度$O(len(words) + len(queries))$
  • 空间复杂度$O(len(words))$

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
inline bool isYuan(char c) {
return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
}

class Solution {
public:
vector<int> vowelStrings(vector<string>& words, vector<vector<int>>& queries) {
vector<int> prefix(words.size() + 1, 0);
for (int i = 0; i < words.size(); i++) {
prefix[i + 1] = prefix[i] + (isYuan(words[i][0]) && isYuan(words[i].back())); // 这里&&外必须加括号,不然会先执行prefix[i] + isYuan(words[i][0]),再将结果于isYuan(words[i].back())做与运算
// printf("prefix[%d] = %d, prefix[%d] = %d\n", i, prefix[i], i + 1, prefix[i + 1]); //**********
}
// for (int t : prefix) {printf("%d ", t);} puts(""); //**********
vector<int> ans(queries.size());
for (int i = 0; i < queries.size(); i++) {
ans[i] = prefix[queries[i][1] + 1] - prefix[queries[i][0]];
}
return ans;
}
};

Python

1
2
3
4
5
6
7
8
9
10
11
# from typing import List

def isYuan(c: str) -> bool:
return c == 'a' or c == 'e' or c == 'i' or c == 'o' or c == 'u'

class Solution:
def vowelStrings(self, words: List[str], queries: List[List[int]]) -> List[int]:
prefix = [0] * (len(words) + 1)
for i in range(len(words)):
prefix[i + 1] = prefix[i] + (isYuan(words[i][0]) and isYuan(words[i][-1]))
return [prefix[q[1] + 1] - prefix[q[0]] for q in queries]

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/131014779


2559.统计范围内的元音字符串数:前缀和
https://blog.letmefly.xyz/2023/06/02/LeetCode 2559.统计范围内的元音字符串数/
作者
Tisfy
发布于
2023年6月2日
许可协议