算法练习第24题-反转字符串中的元音字母

155 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

一、题目

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

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

示例 1:

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


示例 2:

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

作者:力扣 (LeetCode) 链接:leetcode-cn.com/leetbook/re… 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

二、思路

暴力解法

  • 先将字符串转换成数组
  • 定于新的元音数组,通过循环把所有的字符串的元音字符按顺序push进数组
  • 将元音数组翻转
  • 再次循环元音字符组成的元音数组,每遇到语音就将新的元音数组替换过去

双指针思路

  • 首先先将字符串转化成数组
  • 判断左指针不存在元音字母的时候,左指针向右移动
  • 判断右指针不存在元音字母的时候,右指针向左移动
  • 当左指针遇到元音字母的时候停下,右指针继续向左移动,直到遇到元音字母
  • 然后更换左右指针元音字母的位置,左右指针继续移动,直到条件不成立

三、代码

暴力解法

这道题主要是考察的双指针,暴力解法很简单,因为创建了新的数组空间,因此不在写代码

双指针代码

let s = "hello"
let reverseVowels = function(s) {
  /**
   * 首先先将字符串转化成数组
   * 
   * 双指针
   * 判断左指针不存在元音字母的时候,左指针向右移动
   * 判断右指针不存在元音字母的时候,右指针向左移动
   * 当左指针遇到元音字母的时候停下,右指针继续向左移动,直到遇到元音字母
   * 然后更换左右指针元音字母的位置,左右指针继续移动,直到条件不成立
   * */ 
  let left = 0, right = s.length - 1
  const arr = Array.from(s)
  while(left < right) {
    if(!"aeiouAEIOU".includes(arr[left])) {
      left++
    }
    if(!"aeiouAEIOU".includes(arr[right])) {
      right--
    }
    if("aeiouAEIOU".includes(arr[left]) && "aeiouAEIOU".includes(arr[right])) {
      const a = arr[left]
      arr[left] = arr[right]
      arr[right] = a
      left++
      right--
    }
  }
  return arr.join('')
}

四、 测试用例

测试用例1

image.png