美文网首页
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