C++实现字符串元音字母反转的两种方法

 更新时间:2024年07月19日 10:40:18   作者:修炼室  
在处理字符串问题时,我们经常需要对其中的字符进行操作,例如反转、替换等,本文将详细讨论如何在C++中实现仅反转字符串中的所有元音字母,并返回结果字符串,需要的朋友可以参考下

C++实现字符串元音字母反转的巧妙方法

在处理字符串问题时,我们经常需要对其中的字符进行操作,例如反转、替换等。本文将详细讨论如何在C++中实现仅反转字符串中的所有元音字母,并返回结果字符串。元音字母包括’a’、‘e’、‘i’、‘o’、‘u’,且可能以大小写两种形式出现不止一次。我们将介绍两种方法:利用数据结构和双指针算法。

示例

  • 输入:s = “hello”
    输出:“holle”
  • 输入:s = “leetcode”
    输出:“leotcede”

方法一:利用数据结构存储元音位置和字符并反转

代码实现

class Solution {
public:
    string reverseVowels(string s) {
        vector<pair<int, char>> yuan;

        // 设置一个集合装元音字母,然后一个个判断,如果是直接放入yuan,然后再倒序
        set<char> vowels = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'};

        for(int i = 0; i < s.size(); i++) {
            if(vowels.find(s[i]) != vowels.end()) {
                yuan.push_back({i, s[i]});
            }
        }
        reverse(yuan.begin(), yuan.end());

        for(int i = 0; i < yuan.size(); i++) {
            s[yuan[i].first] = yuan[yuan.size() - 1 - i].second;
        }

        return s;
    }
};

1. 如何在C++中存储数字和字符并支持翻转

在C++中,可以使用vector<pair<int, char>>来同时存储数字和字符。vector是一个动态数组,可以支持反转操作。如下所示:

vector<pair<int, char>> yuan;
yuan.push_back({index, character});
reverse(yuan.begin(), yuan.end());

2. 判断字符是否在列表中

在判断一个字符是否在列表中时,使用setfind方法虽然简洁。

if(vowels.find(s[i]) != vowels.end())

但由于set的查找复杂度为O(log n),对于小规模查找来说,直接使用特判方法效率更高,如下所示:

bool isVowel(char c) {
    return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' || 
           c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U';
}

使用set_find操作

在这里插入图片描述

使用特判

在这里插入图片描述

3. 巧妙的反转操作

使用vector<pair<int, char>>存储元音字符及其索引,并进行反转:

for(int i = 0; i < yuan.size(); i++) {
    s[yuan[i].first] = yuan[yuan.size() - 1 - i].second;
}

这个方法减少了对原始字符串的迭代次数,只需处理元音字符的数量,而不是整个字符串。

方法二:双指针法

双指针法是一种高效的解决方案。在需要反转字符串中的部分字符时,通过从两端向中间移动指针来找到需要交换的字符,避免了额外的空间开销。

代码实现

class Solution {
public:
    string reverseVowels(string s) {
        int i = 0, j = s.size() - 1;
        
        while (i < j) {
            if (!isVowel(s[i])) {
                i++;
            } else if (!isVowel(s[j])) {
                j--;
            } else {
                swap(s[i], s[j]);
                i++;
                j--;
            }
        }
        return s;
    }
    
    bool isVowel(char c) {
        return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' || 
               c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U';
    }
};

双指针法核心思路

双指针法是一种简洁高效的解决方案,通过在字符串两端同时移动指针来实现反转操作。以下是详细步骤:

初始化指针

  • i指向字符串开头。
  • j指向字符串结尾。

移动指针并交换元音

  • 当指针ij未相遇时,继续执行循环。
  • 如果i指向的字符不是元音,i右移。
  • 如果j指向的字符不是元音,j左移。
  • 如果ij指向的字符都是元音,则交换这两个字符,并分别移动指针ij

优点

空间复杂度低:双指针法在原地反转元音字符,不需要额外的存储空间。时间复杂度低:该方法仅需一次遍历,时间复杂度为O(n),其中n是字符串的长度。

总结

在处理字符串元音反转的问题时,利用数据结构和双指针法都是有效的解决方案。数据结构方法通过存储元音的位置和字符来实现反转,而双指针法通过两端同时向中间移动指针来找到需要交换的字符。这两种方法各有优劣,具体选择取决于问题的规模和对空间复杂度的要求。

以上就是C++实现字符串元音字母反转的两种方法的详细内容,更多关于C++元音字母反转的资料请关注脚本之家其它相关文章!

相关文章

  • C++的拷贝构造函数你了解吗

    C++的拷贝构造函数你了解吗

    这篇文章主要为大家详细介绍了C++的拷贝构造函数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C/C++之long int与long long的区别及说明

    C/C++之long int与long long的区别及说明

    这篇文章主要介绍了C/C++之long int与long long的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • EasyX绘制透明背景图的方法详解

    EasyX绘制透明背景图的方法详解

    这篇文章主要为大家详细介绍了EasyX绘制透明背景图的方法,文中的示例代码讲解详细,对我们深入了解EasyX有一定的帮助,需要的可以参考一下
    2023-01-01
  • C语言商品销售系统源码分享

    C语言商品销售系统源码分享

    这篇文章主要为大家分享了C语言商品销售系统源码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • C++反射的一种实现方法详解

    C++反射的一种实现方法详解

    这篇文章主要给大家介绍了关于C++反射的一种实现方法,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • C++ atoi()函数用法案例详解

    C++ atoi()函数用法案例详解

    这篇文章主要介绍了C++ atoi()函数用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • 一文详解C语言操作符

    一文详解C语言操作符

    这篇文章主要详细介绍了C语言的操作符,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • c++如何实现跳表(skiplist)

    c++如何实现跳表(skiplist)

    这篇文章主要介绍了c++如何实现跳表,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-08-08
  • C++结构体用法实例分析

    C++结构体用法实例分析

    这篇文章主要介绍了C++结构体用法,实例分析了默认构造函数,复制构造函数,运算符重载等使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • 一文教你快速了解C语言中的作用域和常量

    一文教你快速了解C语言中的作用域和常量

    作用域(scope)是程序设计概念,通常来说一段程序代码中所用到的名字并不总是有效/可用,下面这篇文章主要给大家介绍了关于如何快速了解C语言中的作用域和常量的相关资料,需要的朋友可以参考下
    2023-06-06

最新评论