首页 > 其他分享 >2559. 统计范围内的元音字符串数(前缀和) o(n)时间复杂度

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

时间:2024-06-07 16:01:09浏览次数:17  
标签:pre 前缀 2559 复杂度 数组 查询 单词 words queries

给你一个下标从 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 = 0
        pre = [0] * (len(words))
        for i in range(len(words)):
            presum += nums[i]
            pre[i] = presum
        
        ans = []
        for i in queries:
            count = 0
            if 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 中,并最终返回该列表作为函数的结果。

 

标签:pre,前缀,2559,复杂度,数组,查询,单词,words,queries
From: https://blog.csdn.net/m0_53291740/article/details/139528881

相关文章

  • 组合数前缀和计算
    记录一下,下文的除法非特殊注明都是向下取整。求\(F(n,k)=\sum_{i=0}^{k}\binom{n}{i}\pmodp\)。首先使用卢卡斯定理。\[\begin{aligned}&\sum_{i=0}^{k}\binom{n}{i}\\=&\sum_{i=0}^{k}\binom{\frac{n}{p}}{\frac{i}{p}}\binom{n\bmodp}{i\bmodp}\\=&\s......
  • 求前缀表达式的值
    1.题目7-7求前缀表达式的值分数25全屏浏览切换布局作者 DS课程组单位 浙江大学算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:++2*3-74/84。请设计程序计算前缀表达式......
  • 算法的时间复杂度和空间复杂度
    目录1.算法效率1.1如何衡量一个算法的好坏1.2算法的复杂度1.3复杂度在校招中的考察2.时间复杂度2.1时间复杂度的概念2.2大O的渐进表示法2.3常见时间复杂度计算举例实例1:实例2:实例3:实例4:实例5:实例6:实例7:实例8:3.空间复杂度实例1:实例2:实例3:4.常见复杂度对比1.......
  • Java—集合框架、时间和空间复杂度
    一、集合框架Java集合框架(JavaCollectionFramework),又称为容器(container),是定义在java.util包下的一组接口(interfaces)和其实现类(classes)其主要表现为将多个元素(element)置于一个单元中,用于对这些元素进行快速、便捷的存储(store)、检索(retrieve)、管理(manipulate......
  • 线段树合并复杂度证明
    以CF600E为例,没看过题目的先去看题。本题的线段树做法,即对题目所给树中每个结点所在子树建树维护数字出现情况。此做法中,当前节点和其兄弟节点对应的线段树需要合并到父节点上,最后父节点上权值update到新树。也就是说对于每个非叶子节点,其有x个子节点,就要合并x次(其实也可以看成x-......
  • 前缀和解决字符串变化问题
    题目小苯有一个长度为\(n\)的字符串\(s\),每次操作他可以选择一个位置的字母将其的大小写反转,也就是说如果字符是小写,则操作后会变成大写,如果字符是大写则反之。他现在希望将\(s\)变为:“前面若干字符是大写,后面的字符全是小写”的样子,例如:"AABBccdd"。(注意:全大写和全小写均不合法......
  • LeetCode 第14题:最长公共前缀题目解析(进阶版)
    本文我们来探索LeetCode第14题——最长公共前缀题目解析(进阶版)。文章目录引言题目介绍解题思路思路1:水平扫描法思路2:垂直扫描法思路3:分治法思路4:二分查找法思路5:字典树(Trie)水平扫描法详细解析步骤1:初始化前缀步骤2:逐个比较示例讲解Java代码实现图......
  • 统计子矩阵+二维前缀和+滑动窗口
    题目链接:0统计子矩阵-蓝桥云课(lanqiao.cn)代码#include<iostream>usingnamespacestd;constintN=505;intnum[N][N];intmain(){ intn,m,k; cin>>n>>m>>k; intcount=0; for(inti=1;i<=n;i++){ for(intj=1;j......
  • 前缀和数组
    //前缀和数组preSum[]:preSum[i]记录nums[0,i-1]区间的累加和classex_preSum{private:vector<int>preSum;public:ex_preSum(vector<int>nums){preSum.resize(nums.size()+1);//原数组下标[0,n-1]。preS......
  • oracle 如何设置口令复杂度和生存周期
    在Oracle数据库中,设置用户密码的复杂度通常是通过密码策略来控制的,而密码的生存周期可以通过数据字典视图DBA_PROFILES来设置。以下是如何设置用户密码复杂度和生存周期的示例代码:--设置密码策略(例如,要求密码必须每90天更改一次,且密码历史不能超过24个月)ALTERPROFILEDEFAULT......