2559.统计范围内的元音字符串数
链接:2559.统计范围内的元音字符串数
难度:Medium
标签:数组、字符串、前缀和
简介:给你一个下标从 0 开始的字符串数组 words 以及一个二维整数数组 queries 。返回一个整数数组,其中数组的第 i 个元素对应第 i 个查询的答案。
题解 1 - cpp
- 编辑时间:2023-06-02
- 执行用时:148ms
- 内存消耗:63.1MB
- 编程语言:cpp
- 解法介绍:前缀和。
class Solution {
public:
    vector<int> vowelStrings(vector<string>& words, vector<vector<int>>& queries) {
        unordered_set<char> s{ 'a', 'e', 'i', 'o', 'u'};
        vector<int> sums(1, 0);
        for (auto &w : words) sums.push_back(sums.back() + (s.count(w[0]) && s.count(w.back()) ? 1 : 0));
        vector<int> res;
        for (auto &q : queries) res.push_back(sums[q[1] + 1] - sums[q[0]]);
        return res;
    }
};
题解 2 - python
- 编辑时间:2023-02-05
- 执行用时:80ms
- 内存消耗:46.7MB
- 编程语言:python
- 解法介绍:同上。
class Solution:
  def vowelStrings(self, words: List[str], queries: List[List[int]]) -> List[int]:
      s = {'a', 'e', 'i', 'o', 'u'}
      sums = list(accumulate(
          (w[0] in s and w[-1] in s for w in words), initial=0))
      return [sums[r + 1] - sums[l] for l, r in queries]
题解 3 - cpp
- 编辑时间:2023-02-05
- 执行用时:128ms
- 内存消耗:63.1MB
- 编程语言:cpp
- 解法介绍:前缀和。
class Solution {
public:
    vector<int> vowelStrings(vector<string>& words, vector<vector<int>>& queries) {
        int n = words.size();
        vector<int> sums(1, 0), ans;
        unordered_set<char> s;
        s.insert('a');
        s.insert('e');
        s.insert('i');
        s.insert('o');
        s.insert('u');
        for (auto &w : words) {
            bool f = s.count(w[0]) && s.count(w[w.size() - 1]);
            sums.push_back(sums.back() + f);
        }
        for (auto &q : queries) {
            ans.push_back(sums[q[1] + 1] - sums[q[0]]);
        }
        return ans;
    }
};
题解 4 - rust
- 编辑时间:2023-02-05
- 执行用时:28ms
- 内存消耗:14.1MB
- 编程语言:rust
- 解法介绍:同上。
impl Solution {
    pub fn vowel_strings(words: Vec<String>, queries: Vec<Vec<i32>>) -> Vec<i32> {
        use std::collections::HashSet;
        let mut set = HashSet::<char>::new();
        for c in "aeiou".to_string().chars().collect::<Vec<char>>() {
            set.insert(c);
        }
        let mut sums = vec![0; 1];
        for w in words {
            let w = w.chars().collect::<Vec<char>>();
            let f = if set.contains(w.first().unwrap()) && set.contains(w.last().unwrap()) {
                1
            } else {
                0
            };
            sums.push(f + *sums.last().unwrap());
        }
        let mut ans = vec![];
        for q in queries {
            ans.push(sums[q[1] as usize + 1] - sums[q[0] as usize]);
        }
        ans
    }
}