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
网友评论