Swift - LeetCode - 反轉(zhuǎn)字符串中的元音字母

題目

給你一個字符串 s,僅反轉(zhuǎn)字符串中的所有元音字母,并返回結(jié)果字符串。

元音字母包括 a、ei、o、u,且可能以大小寫兩種形式出現(xiàn)。

示例 1:

  • 輸入: s = "hello"
  • 輸出: "holle"

示例 2:

  • 輸入: s = "leetcode"
  • 輸出: "leotcede"

方法一:雙指針

思路及解法

我們可以使用兩個指針 ij 對字符串相向地進(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 += 1j -= 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ù)雜度:O(n),其中 n 是字符串 s 的長度。

  • 空間復(fù)雜度:O(n),其中 n 是字符串 s 的長度。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容