统计范围内的元音字符串数【LC2559】
给你一个下标从 0 开始的字符串数组
words
以及一个二维整数数组queries
。每个查询
queries[i] = [li, ri]
会要求我们统计在words
中下标在li
到ri
范围内(包含 这两个值)并且以元音开头和结尾的字符串的数目。返回一个整数数组,其中数组的第
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 j−i -
实现
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)
- 复杂度