345. Reverse Vowels of a String

本文介绍了一种算法,该算法接收一个字符串作为输入,并仅反转字符串中的元音字母。通过使用双指针技巧,算法有效地实现了元音字母的位置交换。文章提供了详细的实现步骤和示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

Write a function that takes a string as input and reverse only the vowels of a string.

Example 1:
Given s = “hello”, return “holle”.

Example 2:
Given s = “leetcode”, return “leotcede”.

Note:
The vowels does not include the letter “y”.

Subscribe to see which companies asked this question.


思路

  • 一前一后两个指针往中间靠,当判断都是元音字符时,交换字符,直到相遇
  • 由于是string,长度相关的变量类型用了size_t,由于size_t是无符号类型的,尤其要注意在做减法的时候小于0越界翻转的问题,这个在写程序的时候二分查找元音字符的函数isVowel有行代码:
    – endIndex = middleIndex - 1;在middleIndex 为0时会导致endIndex 翻转,所以索性把index的类型从size_t换成int了

代码

const string VOWEL = "AEIOUaeiou";
const size_t VOWEL_SIZE = 10;
class Solution {
public:
    //判断字符是否为元音字符
    bool isVowel(char testChar)
    {
        int startIndex = 0;
        int endIndex = VOWEL_SIZE-1;
        int middleIndex;

        while(endIndex >= startIndex)
        {
            middleIndex = startIndex + (endIndex - startIndex)/2;
            if(testChar == VOWEL.at(middleIndex))
            {
                return true;
            }

            if(testChar > VOWEL.at(middleIndex))
            {
                startIndex = middleIndex + 1;
            }
            else
            {
                endIndex = middleIndex - 1;
            }
        }

        return false;
    }
    //交换字符
    void swapChar(string &s,size_t begin,size_t end)
    {
        char tempChar = s[begin];
        s[begin] = s[end];
        s[end] = tempChar;
    }

    string reverseVowels(string s) {
        size_t length = s.size();
        if(length < 2)
        {
            return s;
        }

        size_t beginIndex = 0;
        size_t endIndex = length - 1;
        while(endIndex > beginIndex)
        {
            while(!isVowel(s.at(beginIndex)))
            {
                beginIndex++;
                if(endIndex <= beginIndex)
                {
                    return s;
                }
            }

            while(!isVowel(s.at(endIndex)))
            {
                endIndex--;
                //用的size_t,防止endIndex的值越界翻转
                if(endIndex == 0 || endIndex <= beginIndex)
                {
                    return s;
                }
            }

            swapChar(s,beginIndex,endIndex);
            beginIndex++;
            endIndex--;
        }

        return s;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值