题目
给你一个字符串 s
,仅反转字符串中的所有元音字母,并返回结果字符串。
元音字母包括 a
、e
、i
、o
、u
,且可能以大小写两种形式出现。
示例 1:
- 输入:
s = "hello"
- 输出:
"holle"
示例 2:
- 输入:
s = "leetcode"
- 输出:
"leotcede"
方法一:双指针
思路及解法
我们可以使用两个指针 i
和 j
对字符串相向地进行遍历。
具体地,我们先将字符 s
转为字符数组 arr
,然后创建包含所有元音字符的元组 vowelSet
,指针 i
初始时指向数组 arr
的首位,指针 j
初始时指向数组 arr
的末位。在遍历的过程中, 遍历条件是 i < j
,我们每次遍历时,先判断元组是否包含字符 arr[i]
,若不包含,使 i += 1
,然后 continue
跳出循环,若此条件不成立, 则继续判断元组是否包含字符 arr[j]
,若不包含,则使 j -= 1
,然后跳出循环,如果这两个条件都不成立,则代表 arr[i]
与 arr[j]
都是原音字符,这时候交换两个字符的位置,并使 i += 1
,j -= 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)
}
}
复杂度分析
时间复杂度:
,其中
是字符串
的长度。
空间复杂度:
,其中
是字符串
的长度。