題目
給你一個字符串 s,僅反轉(zhuǎn)字符串中的所有元音字母,并返回結(jié)果字符串。
元音字母包括 a、e、i、o、u,且可能以大小寫兩種形式出現(xiàn)。
示例 1:
- 輸入:
s = "hello"- 輸出:
"holle"
示例 2:
- 輸入:
s = "leetcode"- 輸出:
"leotcede"
方法一:雙指針
思路及解法
我們可以使用兩個指針 i 和 j 對字符串相向地進(jìn)行遍歷。
具體地,我們先將字符 s 轉(zhuǎn)為字符數(shù)組 arr,然后創(chuàng)建包含所有元音字符的元組 vowelSet,指針 i 初始時指向數(shù)組 arr 的首位,指針 j 初始時指向數(shù)組 arr 的末位。在遍歷的過程中, 遍歷條件是 i < j,我們每次遍歷時,先判斷元組是否包含字符 arr[i],若不包含,使 i += 1,然后 continue 跳出循環(huán),若此條件不成立, 則繼續(xù)判斷元組是否包含字符 arr[j],若不包含,則使 j -= 1,然后跳出循環(huán),如果這兩個條件都不成立,則代表 arr[i] 與 arr[j] 都是原音字符,這時候交換兩個字符的位置,并使 i += 1,j -= 1,直到觸發(fā)判斷條件,則說明所有的元音字母均已遍歷過,就可以退出遍歷的過程。最后將數(shù)組 arr 轉(zhuǎn)為字符串并返回。
代碼
class Solution {
func reverseVowels(_ s: String) -> String {
var arr: [Character] = Array(s)
let vowelSet: Set<Character> = ["a", "e", "i", "o", "u", "A", "E", "I", "O", "U"]
var i: Int = 0
var j: Int = arr.count - 1
while i < j {
if !vowelSet.contains(arr[i]) {
i += 1
continue
}
if !vowelSet.contains(arr[j]) {
j -= 1
continue
}
arr.swapAt(i, j)
i += 1
j -= 1
}
return String(arr)
}
}
復(fù)雜度分析
時間復(fù)雜度:
,其中
是字符串
的長度。
空間復(fù)雜度:
,其中
是字符串
的長度。