【LetMeFly】2559.统计范围内的元音字符串数
力扣题目链接:https://leetcode.cn/problems/count-vowel-strings-in-ranges/
给你一个下标从 0 开始的字符串数组 words
以及一个二维整数数组 queries
。
每个查询 queries[i] = [li, ri]
会要求我们统计在 words
中下标在 li
到 ri
范围内(包含 这两个值)并且以元音开头和结尾的字符串的数目。
返回一个整数数组,其中数组的第 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。
令
p
r
e
f
i
x
[
i
+
1
]
prefix[i + 1]
prefix[i+1]代表words的下标0到i的单词中首尾都是元音字母的单词个数
,
那么
p
r
e
f
i
x
[
r
+
1
]
−
p
r
e
f
i
x
[
l
]
prefix[r + 1] - prefix[l]
prefix[r+1]−prefix[l]就是words的l到r中首尾都是元音字母的单词个数
。
并且prefix[i + 1]可以由prefix[i]和words[i]很轻松地得到。文章来源:https://www.toymoban.com/news/detail-469057.html
- 时间复杂度 O ( l e n ( w o r d s ) + l e n ( q u e r i e s ) ) O(len(words) + len(queries)) O(len(words)+len(queries))
- 空间复杂度 O ( l e n ( w o r d s ) ) O(len(words)) O(len(words))
AC代码
C++
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
# 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文章来源地址https://www.toymoban.com/news/detail-469057.html
到了这里,关于LeetCode 2559. 统计范围内的元音字符串数:前缀和的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!