[LeetCode] 345. 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”.

分析,
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*pStart] !=1 )pStart++;
        while(pEnd>pStart && buf[*pEnd] !=1) pEnd--;
        c = *pStart;
        *pStart = *pEnd;
        *pEnd =c ;
        pStart++;
        pEnd--;
    }
    return s;
}

你可能感兴趣的:(LeetCode)