美文网首页
Swift算法7-Reverse Vowels

Swift算法7-Reverse Vowels

作者: 四毛哥掉落的鳞片 | 来源:发表于2016-09-02 08:28 被阅读0次

    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".

    so here's what i wrote, it takes 12ms to reverse "hello":

    class Solution {
        func reverseVowels(s: String) -> String {
            if s == "" { return "" }
            let vowels = ["a","e","i","o","u","A","E","I","O","U"]
            var sVowels = [Character]()
            var reversedStr = ""
            for vChar in s.characters {
                if vowels.contains(String(vChar)) {
                    sVowels.append(vChar)
                }
            }
            for char in s.characters {
                if !vowels.contains(String(char)) {
                    reversedStr = reversedStr + String(char)
                } else if vowels.contains(String(char)) {
                    reversedStr = reversedStr + String(sVowels.removeLast())
                }
            }
            
           return reversedStr
        }
    }
    

    so it is the first version i made, above.
    and then i post this question on stack overflow, people gave me some more elegant solutions, i will sum them up here:

    func reverseVowels(s: String) -> String {
        if s == "" { return "" }
        let vowels: Set<Character> = ["a","e","i","o","u","A","E","I","O","U"]
        var indices = [Int]()
        var chars = Array(s.characters)
        for (index, vChar) in chars.enumerate() {
            if vowels.contains(vChar) {
                indices.append(index)
            }
        }
        let count = indices.count
        for i in 0 ..< count/2 {
            swap(&chars[indices[i]], &chars[indices[count - i - 1]])
        }
    
        return String(chars)
    }
    
    func reverseVowels(s: String) -> String {
        // Create a set for vowels.
        let vowels: Set<Character> = ["a","e","i","o","u","A","E","I","O","U"]
    
        // Convert input string to array so that we can write into it.
        var result = Array(s.characters)
    
        var i = 0
        var j = result.count - 1
        while i < j {
            if !vowels.contains(result[i]) {
                i += 1
            }
            else if !vowels.contains(result[j]) {
                j -= 1
            }
            else {
                // Both are vowels.
                let temp = result[i]
                result[i] = result[j]
                result[j] = temp
                i += 1
                j -= 1
            }
        }
        return String(result)
    }
    
    extension String {
    
        static let vowels: Array<Character> = ["a","e","i","o","u","A","E","I","O","U"]
    
        func reverseVowels() -> String {
            if self == "" { return "" }
    
            var chars = Array(self.characters)
    
            let indices = chars.enumerate().filter{ String.vowels.contains($0.1) }.map{ $0.0 }
    
            let count = indices.count
            for i in 0 ..< count/2 {
                swap(&chars[indices[i]], &chars[indices[count - i - 1]])
            }
    
            return String(chars)
        }
    }
    
    "A test string".reverseVowels() //you can call your method directly on a string
    

    相关文章

      网友评论

          本文标题:Swift算法7-Reverse Vowels

          本文链接:https://www.haomeiwen.com/subject/vnuhettx.html