Easy

题目描述

给你一个下标从 0 开始的字符串数组 words 和两个整数 left 和 right 。

如果字符串以元音字母开头并以元音字母结尾,那么该字符串就是一个 元音字符串 ,其中元音字母是 ‘a’、’e’、‘i’、‘o’、‘u’ 。

返回 words[i] 是元音字符串的数目,其中 i 在闭区间 [left, right] 内。

示例 1:

输入:words = ["are","amy","u"], left = 0, right = 2
输出:2
解释:
- "are" 是一个元音字符串,因为它以 'a' 开头并以 'e' 结尾。
- "amy" 不是元音字符串,因为它没有以元音字母结尾。
- "u" 是一个元音字符串,因为它以 'u' 开头并以 'u' 结尾。
在上述范围中元音字符串的数目为 2 。

示例 2:

输入:words = ["hey","aeo","mu","ooo","artro"], left = 1, right = 4
输出:3
解释:
- "aeo" 是一个元音字符串,因为它以 'a' 开头并以 'o' 结尾。
- "mu" 不是元音字符串,因为它没有以元音字母开头。
- "ooo" 是一个元音字符串,因为它以 'o' 开头并以 'o' 结尾。
- "artro" 是一个元音字符串,因为它以 'a' 开头并以 'o' 结尾。
在上述范围中元音字符串的数目为 3 。

提示:

  • 1 <= words.length <= 1000
  • 1 <= words[i].length <= 10
  • words[i] 仅由小写英文字母组成
  • 0 <= left <= right < words.length

解题思路

这道题目要求统计指定范围内同时以元音字母开头和结尾的字符串数量。

解题思路:

这是一个简单的模拟题,核心思路是遍历指定范围内的所有字符串,检查每个字符串是否满足条件。

具体步骤:

  1. 首先定义元音字母集合:{‘a’, ’e’, ‘i’, ‘o’, ‘u’}
  2. 遍历范围 [left, right] 内的所有字符串
  3. 对于每个字符串,检查:
    • 第一个字符是否为元音字母
    • 最后一个字符是否为元音字母
  4. 如果同时满足这两个条件,计数器加1
  5. 返回最终的计数结果

时间复杂度分析:

  • 外层循环遍历范围内的字符串:O(right - left + 1)
  • 内层检查首尾字符:O(1)
  • 总体时间复杂度:O(right - left + 1)

空间复杂度分析:

  • 只使用了常数级别的额外空间来存储元音字母集合和计数器
  • 空间复杂度:O(1)

这种直接遍历的方法是最直观和高效的解法,适合题目给定的数据规模。

代码实现

class Solution {
public:
    int vowelStrings(vector<string>& words, int left, int right) {
        unordered_set<char> vowels = {'a', 'e', 'i', 'o', 'u'};
        int count = 0;
        
        for (int i = left; i <= right; i++) {
            string word = words[i];
            if (vowels.count(word[0]) && vowels.count(word[word.length() - 1])) {
                count++;
            }
        }
        
        return count;
    }
};
class Solution:
    def vowelStrings(self, words: List[str], left: int, right: int) -> int:
        vowels = {'a', 'e', 'i', 'o', 'u'}
        count = 0
        
        for i in range(left, right + 1):
            word = words[i]
            if word[0] in vowels and word[-1] in vowels:
                count += 1
                
        return count
public class Solution {
    public int VowelStrings(string[] words, int left, int right) {
        HashSet<char> vowels = new HashSet<char> {'a', 'e', 'i', 'o', 'u'};
        int count = 0;
        
        for (int i = left; i <= right; i++) {
            string word = words[i];
            if (vowels.Contains(word[0]) && vowels.Contains(word[word.Length - 1])) {
                count++;
            }
        }
        
        return count;
    }
}
var vowelStrings = function(words, left, right) {
    const vowels = new Set(['a', 'e', 'i', 'o', 'u']);
    let count = 0;
    
    for (let i = left; i <= right; i++) {
        const word = words[i];
        if (vowels.has(word[0]) && vowels.has(word[word.length - 1])) {
            count++;
        }
    }
    
    return count;
};

复杂度分析

复杂度类型复杂度说明
时间复杂度O(right - left + 1)遍历指定范围内的所有字符串,每次检查首尾字符为常数时间
空间复杂度O(1)只使用常数级别的额外空间存储元音字母集合和计数器