题目
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;
}
};