跳至主要內容

345. 反转字符串中的元音字母


345. 反转字符串中的元音字母

🟢   🔖  双指针 字符串  🔗 力扣open in new window LeetCodeopen in new window

题目

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 题 思路一样。

  1. 双指针初始化:左指针 left 指向字符串的起始位置,右指针 right 指向字符串的末尾位置。

  2. 双指针移动

    • left 指针指向的字符不是元音时,将 left 向右移动。
    • right 指针指向的字符不是元音时,将 right 向左移动。
    • 如果两指针都指向元音,则交换两者的字符,并分别移动两指针。
  3. 终止条件:当 left >= right 时,完成反转。

  4. 辅助函数:使用 isVowel 函数判断字符是否为元音,支持大小写字母。

  5. 构造结果:将字符串转换为数组进行原地修改,最后拼接成字符串返回结果。

复杂度分析

  • 时间复杂度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反转字符串[✓]双指针 字符串🟢🀄️open in new window 🔗open in new window
1119删去字符串中的元音 🔒字符串🟢🀄️open in new window 🔗open in new window
2785将字符串中的元音字母排序字符串 排序🟠🀄️open in new window 🔗open in new window
2810故障键盘字符串 模拟🟢🀄️open in new window 🔗open in new window