LeetCode刷题笔记(Reverse Vowels of a String)

紧接着笔者又刷了一道题,感觉套路和之前很类似。

具体题目如下:

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

Example 1:

Input: "hello"
Output: "holle"
Example 2:

Input: "leetcode"
Output: "leotcede"
Note:
The vowels does not include the letter "y".

题意分析:

给定一个字符串,将其中的元音字母进行翻转,注意元音字母不包括y。

解答如下:

方法一(对撞指针法)

 用两个指针分别指向字符串的两端然后起头并进,当两个指针都指向了元音字母时再进行判断。

这里有几点需要注意:①直接用while(s[l] != 'a' || s[l] != 'u' || s[l] != 'i' || s[l] != 'e' || s[l] != 'o' || s[l] != 'A' || s[l] != 'U' || s[l] != 'I' || s[l] != 'E' || s[l] != 'O' && l < r)去判断本身没有错,但是测试时会得到一个“Time Limit Exceeded”结果,这种情况一般是把这种复杂的与或运算写成一个子函数用于调用就ok了。②还要考虑元音字母的大小写问题。

class Solution {
public:
    string reverseVowels(string s) {
        int l = 0;
        int r = (int)s.size() - 1;
        while( l < r ){
            while(!isVowel(s[l])  && l < r) l ++; //在l < r的前提下才考虑要不要l ++,所以判断要加上l < r
            while(!isVowel(s[r])  && l < r) r --;
            swap(s[l], s[r]);
            l++;
            r--;
        }
        return s;
    }
    bool isVowel(char c){
        char lowerc = tolower(c);//要考虑大小写问题
        return lowerc == 'a' || lowerc == 'e' || lowerc == 'i' || lowerc == 'o' || lowerc == 'u';
    }
};

 

提交后的结果如下:

LeetCode刷题笔记(Reverse Vowels of a String)