345. 反转字符串中的元音字母
345. 反转字符串中的元音字母
题目
Given a string s
, reverse only all the vowels in the string and return it.
The vowels are 'a'
, 'e'
, 'i'
, 'o'
, and 'u'
, and they can appear in both lower and upper cases, more than once.
Example 1:
Input: s = "hello"
Output: "holle"
Example 2:
Input: s = "leetcode"
Output: "leotcede"
Constraints:
1 <= s.length <= 3 * 105
s
consist of printable ASCII characters.
题目大意
给你一个字符串 s
,仅反转字符串中的所有元音字母,并返回结果字符串。
元音字母包括 'a'
、'e'
、'i'
、'o'
、'u'
,且可能以大小写两种形式出现不止一次。
示例 1:
输入: s = "IceCreAm"
输出: "AceCreIm"
解释:
s
中的元音是 ['I', 'e', 'e', 'A']
。反转这些元音,s
变为 "AceCreIm"
.
示例 2:
输入: s = "leetcode"
输出: "leotcede"
提示:
1 <= s.length <= 3 * 10^5
s
由 可打印的 ASCII 字符组成
解题思路
这一题的解题思路是使用双指针对撞,来不断交换首尾元素,和 第 344 题 思路一样。
双指针初始化:左指针
left
指向字符串的起始位置,右指针right
指向字符串的末尾位置。双指针移动:
- 当
left
指针指向的字符不是元音时,将left
向右移动。 - 当
right
指针指向的字符不是元音时,将right
向左移动。 - 如果两指针都指向元音,则交换两者的字符,并分别移动两指针。
- 当
终止条件:当
left >= right
时,完成反转。辅助函数:使用
isVowel
函数判断字符是否为元音,支持大小写字母。构造结果:将字符串转换为数组进行原地修改,最后拼接成字符串返回结果。
复杂度分析
- 时间复杂度:
O(n)
,其中n
是字符串的长度,要遍历字符串中的每个字符。 - 空间复杂度:
O(n)
,使用了一个数组存储字符。
代码
/**
* @param {string} s
* @return {string}
*/
var reverseVowels = function (s) {
s = s.split(''); // 将字符串转为数组,方便交换字符
let left = 0; // 左指针
let right = s.length - 1; // 右指针
while (left < right) {
if (!isVowel(s[left])) {
// 左指针不指向元音
left++; // 向右移动
} else if (!isVowel(s[right])) {
// 右指针不指向元音
right--; // 向左移动
} else {
// 两指针都指向元音
let temp = s[left];
s[left] = s[right];
s[right] = temp;
left++; // 左指针右移
right--; // 右指针左移
}
}
return s.join(''); // 拼接数组返回字符串
};
// 判断字符是否是元音
var isVowel = function (i) {
i = i.toLowerCase(); // 转为小写
return i == 'a' || i == 'e' || i == 'i' || i == 'o' || i == 'u';
};
相关题目
题号 | 标题 | 题解 | 标签 | 难度 | 力扣 |
---|---|---|---|---|---|
344 | 反转字符串 | [✓] | 双指针 字符串 | 🟢 | 🀄️ 🔗 |
1119 | 删去字符串中的元音 🔒 | 字符串 | 🟢 | 🀄️ 🔗 | |
2785 | 将字符串中的元音字母排序 | 字符串 排序 | 🟠 | 🀄️ 🔗 | |
2810 | 故障键盘 | 字符串 模拟 | 🟢 | 🀄️ 🔗 |