当前位置: 首页 > news >正文

2559. 统计范围内的元音字符串数(前缀和) o(n)时间复杂度

给你一个下标从 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
class Solution(object):def vowelStrings(self, words, queries):nums = [0] * (len(words))for i in range(len(words)):# 检查单词是否以元音字母开头和结尾if words[i][0] in ['a','e','i','o','u'] and words[i][-1] in ['a','e','i','o','u']:nums[i] = 1# 计算前缀和presum = 0pre = [0] * (len(words))for i in range(len(words)):presum += nums[i]pre[i] = presumans = []for i in queries:count = 0if i[0] == 0:count = pre[i[1]]else:count = pre[i[1]] - pre[i[0] - 1]ans.append(count)return ans

  1. **预处理:**首先,对给定的单词列表进行预处理,对于每个单词,检查其是否以元音字母开头和结尾。如果是,则将对应的 nums 数组的对应位置标记为 1,表示该位置的单词满足条件,否则标记为 0。

  2. **前缀和:**然后,使用前缀和技巧来快速计算出满足条件的单词数。创建一个前缀和数组 pre,其中 pre[i] 表示从单词列表的开头到第 i 个单词(包括第 i 个单词)满足条件的单词数的累计和。遍历 nums 数组,并计算累计和,将结果存储在 pre 数组中。

  3. **查询处理:**对于每个查询范围 [start, end],我们可以利用前缀和数组 pre 来计算该范围内满足条件的单词数。如果查询范围的起始位置为 0,则直接取 pre[end] 作为答案;否则,我们可以通过计算 pre[end] - pre[start - 1] 来得到该范围内的满足条件的单词数。

  4. **返回答案:**将每个查询的结果存储在一个列表 ans 中,并最终返回该列表作为函数的结果。

相关文章:

  • k-means聚类模型的优缺点
  • 后端 excel的导入
  • 探索k8s集群的配置资源(secret和configmap)
  • 自然语言处理(NLP)—— 主题建模
  • WMS仓储管理系统高效驱动制造企业物料管理
  • dart 基本语法
  • 【Python】认识 Python
  • 【设计模式之外观模式 -- C++】
  • 【数据结构】栈和队列-->理解和实现(赋源码)
  • width: 100%和 width: 100vw这两种写法有什么区别
  • 大模型参加高考,同写2024年高考作文,及格分(通义千问、Kimi、智谱清言、Gemini Advanced、Claude-3-Sonnet、GPT-4o)
  • 2024年安全现状报告
  • 【Postman接口测试】第四节.Postman接口测试项目实战(中)
  • Vue项目安装axios报错npm error code ERESOLVE npm error ERESOLVE could not resolve解决方法
  • selenium中,如何使用选择框
  • 【mysql】环境安装、服务启动、密码设置
  • 2019年如何成为全栈工程师?
  • js操作时间(持续更新)
  • Odoo domain写法及运用
  • SAP云平台里Global Account和Sub Account的关系
  • Swift 中的尾递归和蹦床
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • vue数据传递--我有特殊的实现技巧
  • Wamp集成环境 添加PHP的新版本
  • 简单基于spring的redis配置(单机和集群模式)
  • 码农张的Bug人生 - 见面之礼
  • 面试遇到的一些题
  • 山寨一个 Promise
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 异常机制详解
  • 找一份好的前端工作,起点很重要
  • postgresql行列转换函数
  • 从如何停掉 Promise 链说起
  • #{}和${}的区别?
  • #pragma once与条件编译
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (算法)大数的进制转换
  • (译)2019年前端性能优化清单 — 下篇
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (原創) 物件導向與老子思想 (OO)
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .axf 转化 .bin文件 的方法
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET 中让 Task 支持带超时的异步等待
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .skip() 和 .only() 的使用
  • :如何用SQL脚本保存存储过程返回的结果集
  • [APUE]进程关系(下)
  • [Asp.net MVC]Bundle合并,压缩js、css文件
  • [BZOJ2850]巧克力王国
  • [C++] 容器适配器:深入理解Stack与Queue的底层原理