C++代码入门05 字符串容器

发布时间:2024年01月20日

?

图源:文心一言

上机题目练习整理,本篇作为字符串容器的代码,提供了常规解法及其详细解释,供小伙伴们参考~🥝🥝

  • 第1版:在力扣新手村刷题的记录~🧩🧩
    • 方法:常规枚举解法~

编辑:梅头脑🌸

审核:文心一言

题目: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:
    • 使用word.size()或者word.length(),注意,实际遍历时以0开头,因此最后1位的数组下标为word.size()-1或者word.length()-1;
    • tolower()执行字符串转小写的功能,感兴趣详见🌸,当然,如果输入都是小写的话去掉这一步也问题不大;
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博客

文章来源:https://blog.csdn.net/weixin_42789937/article/details/135713753
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。