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”.
分析,
Vowels:元音字母,根据WIKI上的解释,包括AOIEU,部分情况下包括y,但题目明确写明不包括Y。所以认为Vowels包括AOIEU以及aoieu。
如何判断一个字符是否是元音?跟这10个字符一个一个比较肯定是比较傻的方法。
C里面没有C++的map这种数据结构,为了在O(1)的时间内判断是否是元音,我们可以构建一个数组
char is_vowels[128] = {0};
is_Vowels[‘A’] = is_Vowels[‘a’] ….=1
这样判断一个字母c是否是元音,只要is_Vowels[c] ==1 即可,典型的空间换时间。
反转元音字母位置,只要首尾两个指针分别找到元音字母,然后交换即可。
void init_vowels(char *buf)
{
buf['A'] = buf['a'] = 1;
buf['E'] = buf['e'] = 1;
buf['I'] = buf['i'] = 1;
buf['O'] = buf['o'] = 1;
buf['U'] = buf['u'] = 1;
}
char* reverseVowels(char* s) {
char buf[128] = {0};
int length = strlen(s);
if(length <=1)
return s;
init_vowels(buf);
char *pStart = s;
char *pEnd = s+length -1;
char c;
while(pStart < pEnd){
while(pStart<pEnd && buf[*pStart] !=1 )pStart++;
while(pEnd>pStart && buf[*pEnd] !=1) pEnd--;
c = *pStart;
*pStart = *pEnd;
*pEnd =c ;
pStart++;
pEnd--;
}
return s;
}