5、反转字符串中的元音字母

137 阅读2分钟

原题力扣《反转字符串中的元音字母》

难度简单

题目:

给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串。

元音字母包括 'a'、'e'、'i'、'o'、'u',且可能以大小写两种形式出现不止一次。

示例 1:

输入:s = "hello"
输出:"holle"

示例 2:

输入:s = "leetcode"
输出:"leotcede"

提示:

  • 1 <= s.length <= 3 * 105
  • s 由 可打印的 ASCII 字符组成

解题:

个人:

关键:双指针

  1. 元音字母为 'a'、'e'、'i'、'o'、'u'
  2. 反转元音字母,指的是在字符串内,从左往右的第一个元音与从右往左的第一个元音进行互换
  3. 所以需要两个指针,分别左右开始循环,某一个遇到了元音,则等另一个遇到元音,都遇到后就互换,然后分别继续循环
var isYuanYin = function (s) {
  const yuanyin = ["a", "e", "i", "o", "u"];
  return yuanyin.includes(s.toLowerCase());
};
var reverseVowels = function (s) {
  let left = 0;
  let right = s.length - 1;

  s = s.split(""); // 转为数组,方便位置调换

  // 当左侧小于右侧时,说明还未循环完
  // 当左侧大于右侧时,说明已经循环完
  while (left < right) {
    // 左侧的是否为元音
    const leftYY = isYuanYin(s[left]);

    // 右侧的是否为元音
    const rightYY = isYuanYin(s[right]);
    
    if (leftYY && rightYY) {
      // 当左右都是元音时,进行互换
      const temp = s[left];
      s[left] = s[right];
      s[right] = temp;

      // 互换完成后,进行位移
      left++;
      right--;
    } else {
      // 左侧不为元音时,向右位移一位
      if (!leftYY) left++;

      // 右侧不为元音时,向左位移一位
      if (!rightYY) right--;
    }
  }

  return s.join("");
};

执行用时,消耗内存

76 ms,56.68 MB

耗时:20 min

官方:

关键:双指针

思路:跟我的一样,不赘述

总结:

第一次是知道了解决算法的名称,在知道了“双指针”后,细节也就慢慢写出来了