目录链接:
力扣编程题-解法汇总_分享+记录-CSDN博客
GitHub同步刷题项目:
https://github.com/September26/java-algorithms
原题链接:力扣
描述:
给你一个下标从 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
解题思路:
* 解题思路: * 这题可以轻易的求出words中哪个是符合要求的,哪个不符合。但是难点是queries的范围未10^5,而words的长度也是10^5,所以必须保证O(n)的时间复杂度才可以。 * 所以我们可以使用前缀和的方式来计算,使用数组prefixs记录words中每一位之前的所有符合要求的数量之和。 * 这样第queries[i]的答案就是prefixs[li]-prefixs[ri]
代码:
public class Solution2559 {
Set<String> set = new HashSet<>();
public int[] vowelStrings(String[] words, int[][] queries) {
set.add("a");
set.add("e");
set.add("i");
set.add("o");
set.add("u");
int sum = 0;
int[] prefixs = new int[words.length + 1];
for (int i = 0; i < words.length; i++) {
String word = words[i];
if (set.contains(word.substring(0, 1)) && set.contains(word.substring(word.length() - 1))) {
sum++;
}
prefixs[i + 1] = sum;
}
int[] result = new int[queries.length];
for (int i = 0; i < queries.length; i++) {
int[] query = queries[i];
result[i] = prefixs[query[1] + 1] - prefixs[query[0]];
}
return result;
}
}