Leetcode 345. 反转字符串中的元音字母

1.题目描述

编写一个函数,以字符串作为输入,反转该字符串中的元音字母。

示例 1:

输入: "hello"
输出: "holle"

示例 2:

输入: "leetcode"
输出: "leotcede"

说明:
元音字母不包含字母"y"。

2.思路一:单向遍历,找出元音

Leetcode提交运行时间8ms.

class Solution {
public:
    string reverseVowels(string s) {
        int size = s.size();
        //直接返回
        if(size==0 || size==1) return s;
        
        //遍历,找出元音字母,保存下标
        for(int i=0; i<size; ++i){
            if(isVowel(s[i]))
                idx.push_back(i);
        }
        
        //存在元音字母,反转
        if(idx.size()!=0)
           reverse(s,0,idx.size()-1);
        
        return s;
    }
    
    //反转函数
    void reverse(string& s, int begin, int end){
        for(int m=begin; m<=(begin+end)/2; ++m)
            swap(s[idx[m]],s[idx[begin+end-m]]);
    }
    
    //判断元音函数
    bool isVowel(char v){
//大写与小写
if(v=='a'||v=='i'||v=='o'||v=='u'||v=='e'||v=='A'||v=='I'||v=='O'||v=='U'||v=='E') return true; else return false; } private: vector<int> idx; };

3.思路二:两端从中间遍历,找到立即交换

3.1 下标访问string

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

}

3.2 迭代器访问string

class Solution {
public:
    string reverseVowels(string s) {
        int sz = s.size();
        //直接返回
        if(sz==0 || sz==1) return s;
        
        auto beg = s.begin(), end = s.end()-1;
        while(beg < end){
            //内部while必须再次判断beg<end
            while(beg<end && !isVowel(*beg))
                ++beg;
           //内部while必须再次判断beg<end
            while(beg<end && !isVowel(*end))
                --end;
          
            swap(*beg,*end);
            ++beg;
            --end;            
            }
        return s;
    }
    
    bool isVowel(char v){
        return v=='a'||v=='i'||v=='o'||v=='u'||v=='e'||
            v=='A'||v=='I'||v=='O'||v=='U'||v=='E';
    }

};
  • 内部while必须再次判断beg<end,举一个反例?
原文地址:https://www.cnblogs.com/paulprayer/p/10132306.html