美文网首页
Swift - LeetCode - 反转字符串中的元音字母

Swift - LeetCode - 反转字符串中的元音字母

作者: 晨曦的简书 | 来源:发表于2022-09-04 11:15 被阅读0次

题目

给你一个字符串 s,仅反转字符串中的所有元音字母,并返回结果字符串。

元音字母包括 aeiou,且可能以大小写两种形式出现。

示例 1:

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

示例 2:

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

方法一:双指针

思路及解法

我们可以使用两个指针 ij 对字符串相向地进行遍历。

具体地,我们先将字符 s 转为字符数组 arr,然后创建包含所有元音字符的元组 vowelSet,指针 i 初始时指向数组 arr 的首位,指针 j 初始时指向数组 arr 的末位。在遍历的过程中, 遍历条件是 i < j,我们每次遍历时,先判断元组是否包含字符 arr[i],若不包含,使 i += 1,然后 continue 跳出循环,若此条件不成立, 则继续判断元组是否包含字符 arr[j],若不包含,则使 j -= 1,然后跳出循环,如果这两个条件都不成立,则代表 arr[i]arr[j] 都是原音字符,这时候交换两个字符的位置,并使 i += 1j -= 1,直到触发判断条件,则说明所有的元音字母均已遍历过,就可以退出遍历的过程。最后将数组 arr 转为字符串并返回。

代码

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)
    }
}

复杂度分析

  • 时间复杂度:O(n),其中 n 是字符串 s 的长度。

  • 空间复杂度:O(n),其中 n 是字符串 s 的长度。

相关文章

网友评论

      本文标题:Swift - LeetCode - 反转字符串中的元音字母

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