一、题目描述
编写一个函数,以字符串作为输入,反转该字符串中的元音字母。
示例 1:
输入:"hello"
输出:"holle"
示例 2:
输入:"leetcode"
输出:"leotcede"
二、思路分析
1.双指针
直接使用双指针,两个指针分别指向字符串头尾字母,字符串中的两个指针相向移动,都找到元音字母就交换位置,直到头尾指针位置一致意味着无需再去移动。
因为这次移动的路径是非线性的,所以不应该使用for循环而应该使用while循环,通过找到元音字母或者两个指针位置重合作为循环结束条件。
该算法将给定字符串遍历了一次,时间复杂度为O(n),使用的变量个数为常数个,空间复杂度为O(1)。
var reverseVowels = function (s) {
const vowels = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']
let [start, end] = [0, s.length - 1]
let input = s.split('')
while (end > start) {
while (!vowels.includes(input[start]) && (start < end)) {
start++
}
while (!vowels.includes(input[end]) && (start < end)) {
end--
}
[input[start], input[end]] = [input[end], input[start]]
start++
end--
}
return input.join('')
}
2.抽取替换
将给定字符串中的元音字母抽取出来成为一个数组,反转字符串,再次循环给定字符串,将字符串中的元音字母替换为字符串反转后对应的字符。
该算法将给定字符串遍历了两次,时间复杂度为O(2n),使用的变量个数为常数个,空间复杂度为O(1)。
var reverseVowels = function (s) {
const vowels = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']
let contain = s.split('').filter(v => vowels.includes(v)).reverse()
let index = 0
return s.split('').map(v =>
vowels.includes(v) ? contain[index++] : v
).join('')
}
三、other
- 元音数组应该包含大写小写两种情况
- 本题目的第二种实现还有一种变种实现,直接遍历字符串不转化为数组,修改时直接操作字符串做字符替换
END
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情