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

news/2025/1/15 10:56:24/

来源:力扣(LeetCode)

描述:

给你一个下标从 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

方法:前缀和

为方便表述,以下将以元音开头和结尾的字符串称为「元音字符串」。

这道题要求返回一系列查询的答案,每个查询为计算特定区间中的元音字符串数。可以使用前缀和实现区间查询。

用 n 表示数组 words 的长度,创建长度为 n + 1 的数组 prefixSums,其中 prefixSums[i] 表示数组 words 的前 i 个字符串(即下标范围 [0, i − 1] 的字符串)中的元音字符串数,prefixSums[0] = 0。

从左到右遍历数组 words,对于下标 0 ≤ i < n,执行如下操作:

  • 如果 words[i] 是元音字符串,则 prefixSums[i+1] = prefixSums[i] + 1;
  • 如果 words[i] 不是元音字符串,则 prefixSums[i+1] = prefixSums[i]。

得到前缀和数组之后,对于 0 ≤ i ≤ j < n,区间 [i, j] 中的元音字符串数是 prefixSums[j+1] − prefixSums[i]。

用 ans[i] 表示第 i 个查询 queries[i] 的答案。如果 queries[i] = [starti, endi],则 ans[i] = prefixSums[endi + 1] − prefixSums[starti]。

遍历所有的查询之后,即可得到答案数组 ans。

代码:

class Solution {
public:vector<int> vowelStrings(vector<string>& words, vector<vector<int>>& queries) {int n = words.size();int prefixSums[n + 1];memset(prefixSums, 0, sizeof(prefixSums));for (int i = 0; i < n; i++) {int value = isVowelString(words[i]) ? 1 : 0;prefixSums[i + 1] = prefixSums[i] + value;}vector<int> ans(queries.size());for (int i = 0; i < queries.size(); i++) {int start = queries[i][0], end = queries[i][1];ans[i] = prefixSums[end + 1] - prefixSums[start];}return ans;}bool isVowelString(const string &word) {return isVowelLetter(word[0]) && isVowelLetter(word.back());}bool isVowelLetter(char c) {return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';}
};

执行用时:116ms, 在所有 C++ 提交中击败了84.33%的用户
内存消耗:61.6 MB, 在所有 C++ 提交中击败了99.37%的用户
复杂度分析
时间复杂度:O(n+q),其中 n 是数组 words 的长度,q 是数组 queries 的长度(即查询数)。计算前缀和数组的时间是 O(n),然后计算 q 个查询的答案,计算每个查询的答案的时间是 O(1),因此时间复杂度是 O(n+q)。
空间复杂度:O(n),其中 n 是数组 words 的长度。需要创建长度为 n + 1 的前缀和数组。注意返回值不计入空间复杂度。
author:LeetCode-Solution


http://www.ppmy.cn/news/167980.html

相关文章

【LED子系统深度剖析】十、详细实现流程(番外篇)

个人主页:董哥聊技术 我是董哥,高级嵌入式软件开发工程师,从事嵌入式Linux驱动开发和系统开发,曾就职于世界500强公司! 创作理念:专注分享高质量嵌入式文章,让大家读有所得! 文章目录 1、LED驱动初始化流程1.1 LED驱动匹配以及设备的创建1.1.1 gpio_led_probe1.1.2 gpi…

烤箱的第一次----蛋挞

10个蛋挞&#xff1a; 用料&#xff1a; 牛奶&#xff1a;100g&#xff0c;细砂糖&#xff1a;25g&#xff0c;全蛋&#xff1a;2个&#xff0c;淡奶油&#xff1a;65g&#xff0c;蛋挞皮&#xff1a;10个&#xff1b; 1、准备所有材料&#xff0c; 2、将盆放在电子秤上&#x…

百厨盛达厨房设备中心:乐信万能蒸烤箱适合做什么菜

乐信万能蒸烤箱&#xff0c;是一家德国制造的万能蒸烤箱。遍及全球&#xff0c;支持57种设备语言。占全球一半以上的市场份额。为什么市场占有率如此高。主要因为它能实现蒸、烤、炖。煮、炸、烧烤、焖、烘焙等功能。 中国是美食之乡&#xff0c;素来“民以食为天”&#xff01…

gogs gitlab 私人代码仓库 git服务器 容灾 灾备 轻量 树莓派

树莓派做代码管理案例&#xff1a; 2012年到现在&#xff0c;我们碰到坏掉硬盘的情况十来次&#xff0c;大多是机械硬盘&#xff0c;当然&#xff0c;那些机械盘的工作压力也大。固态用的最狠的目前掉到70%左右&#xff08;intel s3500企业盘和intel 750高速盘&#xff09;&am…

废品回收小程序如何结合人工智能

一、项目背景 随着人们生活水平的提高和消费观念的变化&#xff0c;废品回收行业逐渐成为一个新兴产业。然而&#xff0c;废品回收行业长期存在着管理混乱、信息不对称等问题&#xff0c;废品回收小程序的出现&#xff0c;为废品回收行业提供了新的解决方案。 二、用户需求分…

如何系统学习一门it技术

一、it技术介绍 对于互联网方面&#xff0c;接触很长了&#xff0c;从2015年到现在 所设计的技术方面&#xff1a;Java &#xff0c;python&#xff0c;golang&#xff0c;vue&#xff0c;微信小程序&#xff0c;uniapp&#xff0c;PHP&#xff0c;渗透基础知识&#xff08;工具…

temu,速卖通,国际站如何稳定安全的测评补单,提升权重不降权

随着互联网和电子商务的快速发展&#xff0c;越来越多的企业和个人通过测评&#xff0c;补单进行产品推广和销售。然而&#xff0c;在测评&#xff0c;补单过程中&#xff0c;如何稳定安全地进行&#xff0c;以提升权重而不降权&#xff0c;成为了许多经营者关注的重要问题。林…

day44_项目1

今日内容 零、 复习昨日 零、 复习昨日 一、web开发流程 1.公司部门的组成人事部门HR技术部门(研发部/IT部/java组/h5组/c组/ui组/产品)行政部门财务部门市场部门运营部门总经理老板/董事/CEO2.项目部人员的组成 各种开发人员: UI/前端/后端(java/c/Python/c/android/Object-c…