1. 问题背景与需求分析
今天在LeetCode上遇到一道有趣的字符串统计题目——2559.统计范围内的元音字符串数。题目要求我们处理一个字符串数组和一组查询,统计每个查询指定区间内满足特定条件的字符串数量。这类区间统计问题在实际开发中很常见,比如日志分析、用户行为统计等场景。
具体来说,题目给出:
- 一个字符串数组words,下标从0开始
- 一组查询queries,每个查询是一个区间[li, ri]
- 需要统计words中下标在li到ri之间(包含两端)且满足以下两个条件的字符串数量:
- 以元音字母开头
- 以元音字母结尾
元音字母包括a、e、i、o、u这五个字母(注意题目中通常不区分大小写,但本题明确说明都是小写字母)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心解题思路
2.1 暴力解法分析
最直观的想法是对每个查询,遍历区间内的每个字符串,检查是否满足元音字符串的条件:
cpp复制bool isVowelString(const string& word) {
if(word.empty()) return false;
char first = word[0], last = word.back();
return (first=='a'||first=='e'||first=='i'||first=='o'||first=='u') &&
(last=='a'||last=='e'||last=='i'||last=='o'||last=='u');
}
vector<int> vowelStrings(vector<string>& words, vector<vector<int>>& queries) {
vector<int> ans;
for(auto& q : queries) {
int l = q[0], r = q[1], cnt = 0;
for(int i=l; i<=r; i++) {
if(isVowelString(words[i])) cnt++;
}
ans.push_back(cnt);
}
return ans;
}
这种解法的时间复杂度是O(Q*N),其中Q是查询数量,N是words的平均长度。当Q和N都很大时(比如1e5),这种解法会超时。
2.2 前缀和优化
观察到查询只是统计区间内的满足条件的字符串数量,我们可以使用前缀和技巧来优化:
- 预处理一个前缀和数组prefix,其中prefix[i]表示words前i个字符串中满足条件的数量
- 对于查询[l,r],结果就是prefix[r+1] - prefix[l]
cpp复制vector<int> vowelStrings(vector<string>& words, vector<vector<int>>& queries) {
int
