【每日一题Day225】LC2559统计范围内的元音字符串数 | 前缀和 二分查找

简介: 【每日一题Day225】LC2559统计范围内的元音字符串数 | 前缀和 二分查找

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

给你一个下标从 0 开始的字符串数组words 以及一个二维整数数组 queries

每个查询 queries[i] = [li, ri] 会要求我们统计在 words

中下标在 liri 范围内(包含 这两个值)并且以元音开头和结尾的字符串的数目。

返回一个整数数组,其中数组的第 i 个元素对应第 i 个查询的答案。

**注意:**元音字母是 'a''e''i''o''u'

又是做过的题 只能自己加练了

前缀和

image.png

class Solution {
    public int[] vowelStrings(String[] words, int[][] queries) {
        int n = words.length;
        int m = queries.length;
        int[] sum = new int[n + 1];
        int[] res = new int[m];
        Arrays.fill(res, 0);
        for (int i = 0; i < n; i++){
            if (isVowel(words[i])){
                sum[i + 1] = sum[i] + 1;
            }else{
                sum[i + 1] = sum[i];
            }
        }
        for (int i = 0; i < m; i++){
            int l = queries[i][0], r = queries[i][1];
            res[i] = sum[r + 1] - sum[l];
        }
        return res;
    }
    public boolean isVowel(String word){
        char c = word.charAt(0);
        char c1 = word.charAt(word.length() - 1);
        if ( (c == 'a' || c  == 'e' || c == 'i' || c == 'o' || c == 'u') 
            && (c1 == 'a' || c1  == 'e' || c1 == 'i' || c1 == 'o' || c1 == 'u')){
            return true;
        }
        return false;
    }
}

image.png

class Solution {
    private List<Integer> nums = new ArrayList<>();
    public int[] vowelStrings(String[] words, int[][] queries) {
        Set<Character> vowels = Set.of('a', 'e', 'i', 'o', 'u');
        for (int i = 0; i < words.length; ++i) {
            char a = words[i].charAt(0), b = words[i].charAt(words[i].length() - 1);
            if (vowels.contains(a) && vowels.contains(b)) {
                nums.add(i);
            }
        }
        int m = queries.length;
        int[] ans = new int[m];
        for (int i = 0; i < m; ++i) {
            int l = queries[i][0], r = queries[i][1];
            ans[i] = search(r + 1) - search(l);
        }
        return ans;
    }
    private int search(int x) {
        int l = 0, r = nums.size();
        while (l < r) {
            int mid = (l + r) >> 1;
            if (nums.get(mid) >= x) {
                r = mid;
            } else {
                l = mid + 1;
            }
        }
        return l;
    }
}
作者:ylb
链接:https://leetcode.cn/problems/count-vowel-strings-in-ranges/solutions/2293300/python3javacgotypescript-yi-ti-shuang-ji-lhef/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

image.png

目录
相关文章
|
5月前
【每日一题Day161】LC1641统计字典序元音字符串的数目 | 数位dp
【每日一题Day161】LC1641统计字典序元音字符串的数目 | 数位dp
44 0
|
5月前
【每日一题Day159】LC1638统计只差一个字符的子串数目 | 枚举
【每日一题Day159】LC1638统计只差一个字符的子串数目 | 枚举
35 0
|
5月前
|
存储
【题型总结】寻找满足字符出现奇数次/偶数次的子串个数或者子串最长长度
【题型总结】寻找满足字符出现奇数次/偶数次的子串个数或者子串最长长度
83 0
|
5月前
|
算法
LeetCode算法题---无重复字符的最长子串、寻找两个正序数组的中位数(三)
LeetCode算法题---无重复字符的最长子串、寻找两个正序数组的中位数(三)
60 0
|
3月前
|
存储
2559. 统计范围内的元音字符串数(前缀和) o(n)时间复杂度
2559. 统计范围内的元音字符串数(前缀和) o(n)时间复杂度
|
4月前
|
算法
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
|
5月前
【每日一题Day371】LC2586统计范围内的元音字符串数 | 模拟
【每日一题Day371】LC2586统计范围内的元音字符串数 | 模拟
49 1
|
5月前
【每日一题Day233】LC1170比较字符串最小字母出现频次 | 前缀和
【每日一题Day233】LC1170比较字符串最小字母出现频次 | 前缀和
35 0
|
5月前
【每日一题Day368】LC421数组中两个数的最大异或值 | 字典树
【每日一题Day368】LC421数组中两个数的最大异或值 | 字典树
28 0
|
5月前
【每日一题Day129】LC1247交换字符使得字符串相同 | 贪心
【每日一题Day129】LC1247交换字符使得字符串相同 | 贪心
42 0