leetcode.345 反转字符串中的元音字母 | 刷题打卡

124 阅读1分钟

一、题目描述

编写一个函数,以字符串作为输入,反转该字符串中的元音字母。

示例 1:

输入:"hello"
输出:"holle"

示例 2:

输入:"leetcode"
输出:"leotcede"

二、思路分析

1.双指针

直接使用双指针,两个指针分别指向字符串头尾字母,字符串中的两个指针相向移动,都找到元音字母就交换位置,直到头尾指针位置一致意味着无需再去移动。

因为这次移动的路径是非线性的,所以不应该使用for循环而应该使用while循环,通过找到元音字母或者两个指针位置重合作为循环结束条件。

该算法将给定字符串遍历了一次,时间复杂度为O(n),使用的变量个数为常数个,空间复杂度为O(1)。

var reverseVowels = function (s) {

  const vowels = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']
  let [start, end] = [0, s.length - 1]
  let input = s.split('')

  while (end > start) {
    while (!vowels.includes(input[start]) && (start < end)) {
      start++
    }

    while (!vowels.includes(input[end]) && (start < end)) {
      end--
    }
    [input[start], input[end]] = [input[end], input[start]]
    start++
    end--
  }
  return input.join('')
}

2.抽取替换

将给定字符串中的元音字母抽取出来成为一个数组,反转字符串,再次循环给定字符串,将字符串中的元音字母替换为字符串反转后对应的字符。

该算法将给定字符串遍历了两次,时间复杂度为O(2n),使用的变量个数为常数个,空间复杂度为O(1)。

var reverseVowels = function (s) {
  const vowels = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']
  let contain = s.split('').filter(v => vowels.includes(v)).reverse()
  let index = 0
  return s.split('').map(v => 
    vowels.includes(v) ? contain[index++] : v
  ).join('')
}

三、other

  • 元音数组应该包含大写小写两种情况
  • 本题目的第二种实现还有一种变种实现,直接遍历字符串不转化为数组,修改时直接操作字符串做字符替换

END


本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情