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

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

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

每个查询 queries[i] = [li, ri] 会要求我们统计在 words 中下标在 liri 范围内(包含 这两个值)并且以元音开头和结尾的字符串的数目。

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

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

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

前缀和

  • 思路:需要查询words中某个区间的元音字符串的个数,因此使用前缀和数组 s u m [ i + 1 ] sum[i+1] sum[i+1]计算出下标范围为 [ 0 , i ] [0,i] [0,i]的元音字符串个数,区间 [ l , r ] [l,r] [l,r]内的元音字符串的个数即为 s u m [ r + 1 ] − s u m [ l ] sum[r+1]-sum[l] sum[r+1]sum[l]

  • 实现

    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;
        }
    }
    
    • 复杂度
      • 时间复杂度: O ( n + m ) O(n+m) O(n+m)
      • 空间复杂度: O ( n ) O(n) O(n)

二分查找

  • 思路

    预处理所有以元音开头和结尾的字符串的下标,按顺序记录在数组nums中。然后对每个查询 ( l , r ) (l,r) (l,r),通过二分查找nums中找到第一个大于等于 l l l的下标 i i i,以及第一个大于 r r r的下标 j j j,那么当前查询的答案是 j − i j-i ji

  • 实现

    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)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    
    • 复杂度
      • 时间复杂度: O ( n + m log ⁡ n ) O(n+m\log n) O(n+mlogn)
      • 空间复杂度: O ( n ) O(n) O(n)

猜你喜欢

转载自blog.csdn.net/Tikitian/article/details/131001655
今日推荐