?
图源:文心一言
上机题目练习整理,本篇作为字符串容器的代码,提供了常规解法及其详细解释,供小伙伴们参考~🥝🥝
编辑:梅头脑🌸
审核:文心一言
题目:2586. 统计范围内的元音字符串数 - 力扣(LeetCode)
目录
🔚结语
给你一个下标从?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 。
📇算法思路
- 算法思想:在 [left,right]范围内枚举给定字符串数组 words 中的字符串,并判断其是否以元音字母开头,并且以元音字母结尾;
- 时间复杂度:O(n+e),n是数组的长度,e是枚举表的长度;
- 空间复杂度:O(e),e是枚举表的长度;
??算法代码1
#include <vector>
#include <string>
#include <cctype> // 为了使用 tolower()
using namespace std;
class Solution {
public:
int vowelStrings(vector<string>& words, int left, int right) {
int count = 0;
// 遍历指定范围内的字符串
for (int i = left; i <= right; i++) {
string& word = words[i];
// 判断字符串是否以元音字母开头和结尾
if (!word.empty()) {
char firstChar = tolower(word[0]);
char lastChar = tolower(word[word.size() - 1]);
if ((firstChar == 'a' || firstChar == 'e' || firstChar == 'i' || firstChar == 'o' || firstChar == 'u') &&
(lastChar == 'a' || lastChar == 'e' || lastChar == 'i' || lastChar == 'o' || lastChar == 'u')) {
count++;
}
}
}
return count;
}
};
??算法代码2
class Solution {
public:
int vowelStrings(vector<string>& words, int left, int right) {
// 元音字母集合
vector<char> vowels = {'a', 'e', 'i', 'o', 'u'};
int count = 0;
// 遍历指定范围内的字符串
for (int i = left; i <= right; i++) {
string& word = words[i];
char first = tolower(word[0]); // 转换为小写字母
char last = tolower(word[word.size() - 1]); // 转换为小写字母
// 判断字符串是否以元音字母开头和结尾
if (find(vowels.begin(), vowels.end(), first) != vowels.end() &&
find(vowels.begin(), vowels.end(), last) != vowels.end()) {
count++;
}
}
return count;
}
};
??算法代码3
class Solution {
public:
int vowelStrings(vector<string>& words, int left, int right) {
unordered_set<char> vowels = {'a', 'e', 'i', 'o', 'u'};
int ans = 0;
for (int i = left; i <= right; ++i) {
const string& word = words[i];
if (vowels.count(word[0]) && vowels.count(word.back())) {
++ans;
}
}
return ans;
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/count-the-number-of-vowel-strings-in-range/solutions/2515213/tong-ji-fan-wei-nei-de-yuan-yin-zi-fu-ch-dau9/
?备注:算法代码1、2、3在思路上非常相似,只是语法的细节有些不同,以下详细解释。
📇代码解释
1:遍历指定范围的字符串
以示例2为例,words = ["hey","aeo","mu","ooo","artro"], left = 1, right = 4
- for (int i = left; i <= right; i++) ,这句可以将 i 指向?"aeo",并通过循环遍历"aeo","mu","ooo","artro";
- string& word = words[i];?创建一个对
words
数组中索引为i(words[i])
的字符串的引用(string&),并将其命名为word;如果是第1轮循环,word中的内容为
aeo;
2:判断字符串的长度
- 算法1、算法2:
char firstChar = tolower(word[0]); char lastChar = tolower(word[word.size() - 1]);
- 算法3:
- 使用word.back(),直接读取最后一位字符;此处的word[0]也可写作word(word.front()),直接读取第1位字符;
- 相对地,.begin(),.end()则用于遍历字符串的开始与截止,之前的题目介绍过相关用法🌸字符串大写转小写,🌸C++代码入门03 字符串-CSDN博客;
vowels.count(word[0]) && vowels.count(word.back())
3:判断字符串以元音开头
- 算法1:||逻辑或、&&逻辑与
- if ((firstChar == 'a' || firstChar == 'e' || firstChar == 'i' || firstChar == 'o' || firstChar == 'u') && (lastChar == 'a' || lastChar == 'e' || lastChar == 'i' || lastChar == 'o' || lastChar == 'u'))? 这一步通过逻辑与,逻辑或的运算,暴力枚举
- 算法2:vector
- vector<char> vowels = {'a', 'e', 'i', 'o', 'u'};? ?这一步定义容器vowels;
- if (find(vowels.begin(), vowels.end(), first) != vowels.end() && ?find(vowels.begin(), vowels.end(), last) != vowels.end())? 这一步暴力遍历字符串,查询是否与容器vowels内的元音字母匹配;
- 算法3:unordered_set
- unordered_set<char> vowels = {'a', 'e', 'i', 'o', 'u'};? 这一步定义无序集合vowels,它内部使用哈希表(hash table)来实现,因此它的查找、插入和删除操作的平均时间复杂度通常为 O(1);🌸数据结构02附录02:哈希表[C++]-CSDN博客
- if (vowels.count(word[0]) && vowels.count(word.back())),表示可以在哈希表vowels中查询到元音字母。
博文到此结束,写得模糊或者有误之处,欢迎小伙伴留言讨论与批评,督促博主优化内容{例如有错误、难理解、不简洁、缺功能}等,博主会顶锅前来修改~~😶?🌫?😶?🌫?
我是梅头脑,本片博文若有帮助,欢迎小伙伴动动可爱的小手默默给个赞支持一下,感谢点赞小伙伴对于博主的支持~~🌟🌟
同系列的博文:🌸数据结构_梅头脑_的博客-CSDN博客
同博主的博文:🌸随笔03 笔记整理-CSDN博客