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 * 105sconsist 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^5s由 可打印的 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 | 故障键盘 | 字符串 模拟 | 🟢 | 🀄️ 🔗 |
