/**
 * Question Link: https://leetcode.com/problems/reverse-vowels-of-a-string/
 * Primary idea: Two pointers, iterate the string and swap two characters each time, 
 * 
 * Note: the input String is case sensitive; thus "aA" should be transferred to "Aa"
 * Time Complexity: O(n), Space Complexity: O(n)
 *
 */

class ReverseVowelsOfAString {
    func reverseVowels(s: String) -> String {
        var left = 0
        var right = s.characters.count - 1
        var chars = [Character](s.characters)
        
        while left < right {
            while left < right && !_isVowel(chars[left]) {
                left += 1
            }
            while left < right && !_isVowel(chars[right]) {
                right -= 1
            }
            guard left < right else {
                break
            }
            _swap(&chars, left, right)
            left += 1
            right -= 1
        }
        
        return String(chars)
    }
    
    private func _isVowel(char: Character) -> Bool {
        var char = String(char).lowercaseString
        if char == "a" || char == "e" || char == "i" || char == "o" || char == "u" {
            return true
        }
        
        return false
    }
    
    private func _swap<T>(inout chars: Array<T>, _ p: Int, _ q: Int) {
        var temp = chars[p]
        chars[p] = chars[q]
        chars[q] = temp
    }
}