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

简介: 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 = 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。


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


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


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


相关文章
|
5月前
leetcode-1220:统计元音字母序列的数目
leetcode-1220:统计元音字母序列的数目
46 0
|
5月前
【每日一题Day225】LC2559统计范围内的元音字符串数 | 前缀和 二分查找
【每日一题Day225】LC2559统计范围内的元音字符串数 | 前缀和 二分查找
46 0
|
5月前
|
存储
【题型总结】寻找满足字符出现奇数次/偶数次的子串个数或者子串最长长度
【题型总结】寻找满足字符出现奇数次/偶数次的子串个数或者子串最长长度
83 0
|
5月前
【每日一题Day161】LC1641统计字典序元音字符串的数目 | 数位dp
【每日一题Day161】LC1641统计字典序元音字符串的数目 | 数位dp
44 0
|
5月前
|
算法
LeetCode算法题---无重复字符的最长子串、寻找两个正序数组的中位数(三)
LeetCode算法题---无重复字符的最长子串、寻找两个正序数组的中位数(三)
60 0
|
5月前
|
机器学习/深度学习 算法 测试技术
【组合数学 容斥原理 逆向思考】2930. 重新排列后包含指定子字符串的字符串数目
【组合数学 容斥原理 逆向思考】2930. 重新排列后包含指定子字符串的字符串数目
|
5月前
|
算法 测试技术 C#
【字符串】【贪心】【 树状数组】2193. 得到回文串的最少操作次数
【字符串】【贪心】【 树状数组】2193. 得到回文串的最少操作次数
|
5月前
|
算法 测试技术 C++
【贪心 堆 】3081. 替换字符串中的问号使分数最小
【贪心 堆 】3081. 替换字符串中的问号使分数最小
|
5月前
|
存储 C语言 Windows
Day5 统计回文、连续最大和
Day5 统计回文、连续最大和
48 0
|
算法 C语言 C++
【前缀和】1456.定长子串中元音的最大数目
本篇将学习前缀和OJ题定长子串中元音的最大数目相关知识。
70 1