---
# System prepended metadata

title: 345. Reverse Vowels of a String
tags: [LeetCode75, JavaScript, Easy, important, Array/String]

---

反轉一個陣列中的全部母音

思考
1.掃一次用一個vector<char>放蒐集到的母音
2.掃一次找到母音從尾端開始放 結束
```c++=
class Solution {
public:
    string reverseVowels(string s) {
        //用一個vector紀錄得到的母音
        vector <char> temp;
        int n = s.size();
        for(int i = 0; i < n; i++){
            //先把母音都抓下來
            if(s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u' || s[i] == 'A' || s[i] == 'E' || s[i] == 'I' \
               || s[i] == 'O' || s [i] == 'U'){
                temp.push_back(s[i]);
            }
        }
        int m = temp.size();
        for(int i = 0; i < n; i++){
            if(s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u' || s[i] == 'A' || s[i] == 'E' || s[i] == 'I' \
               || s[i] == 'O' || s [i] == 'U'){
                s[i] = temp[m-1];
                m--;
            }                
        }        
        return s;
    }
};

```
    
    
思考
1.用while 從陣列前後找到母音 做交換 直到 前 < 後
        
```c++
class Solution {
public:
    bool isVowels(char p){
        if(p == 'a' || p == 'e' || p == 'i' || p == 'o' \
               || p == 'u' || p == 'A' || p == 'E' || p == 'I' \
               || p == 'O' || p == 'U'){
                   return true;
               }else{
                   return false;
               }
    }
    string reverseVowels(string s) {
        //用雙指標 頭尾交換
        //結束點是前指標大於後指標
        //利用token去控制前後指標的停止，可以省略用while再left去找母音
        int n = s.size();
        int left = 0;
        int right = n - 1;
        //利用token紀錄前後指標有無找到母音
        bool tk1 = 0, tk2 = 0;
        while(left < right){
            //先找到前指標的母音
            if( (!tk1) && isVowels(s[left])){
                   //如果找到前指標的母音
                   tk1 = 1;
               }else if(tk1 == 0){
                   //如果還沒有找到前指標母音則指標前進
                   left++;
               }
            if( (!tk2) && isVowels(s[right])){
                   //如果找到前指標的母音
                   tk2 = 1;
               }else if(tk2 == 0){
                   //如果還沒有找到後指標母音則指標後退
                   right--;
               }
            //如果前後指標都找到母音   
            if(tk1 && tk2){
                //SWAP母音
                swap(s[left], s[right]);
                tk1 = 0;
                tk2 = 0;
                left++;
                right--;
            }                 
        } 
        return s;
    }
};
```
    
```=
/**
 * @param {string} s
 * @return {string}
 */
var reverseVowels = function(s) {
    const VOWELS = {
        'a' : 1,
        'e' : 1,
        'i' : 1,
        'o' : 1,
        'u' : 1,
        'A' : 1,
        'E' : 1,
        'I' : 1,
        'O' : 1,
        'U' : 1,
    }
    const arr = s.split('');
    let left = 0;
    let right = s.length-1;
    while(left < right){
        if(VOWELS[arr[left]] && VOWELS[arr[right]]){
            [arr[left], arr[right]] = [arr[right], arr[left]];
            left++;
            right--;
        }else if(VOWELS[arr[left]]){
            right--;
        }else{
            left++;
        }
    }
    return arr.join('');
};
```