j

jaryue

V1

2023/03/25阅读:14主题:默认主题

leecode435反转字符串元音字母

leecode 345

题目描述

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

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

示例 1:

输入:s = "hello" 输出:"holle" 示例 2:

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

提示:

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

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/reverse-vowels-of-a-string 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

法1

双指针法:\

  1. 因为string是不可以直接修改的,所有我们将其转为byte数组进行操作,
//定义rebyt,传入参数为[]byte,用于处理不可更改 的string
func rebyt(s []byte) string {
 ```
 return string(s)
}
  1. 双指针法遍历字符串,i,j分别从0与len-1开始遍历,循环条件为i<j
    当i与j都为元音字母是交换两者的位置否则指针继续前进直到遇到元音字母时停止
//核心代码
for i, j := 0len(s)-1; i < j; {
  if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u' || s[i] == 'A' || s[i] == 'E' || s[i] == 'I' || s[i] == 'O' || s[i] == 'U') && (s[j] == 'a' || s[j] == 'e' || s[j] == 'i' || s[j] == 'o' || s[j] == 'u' || s[j] == 'A' || s[j] == 'E' || s[j] == 'I' || s[j] == 'O' || s[j] == 'U') {//判断两者都等于元音字母
   t := s[i]
   s[i] = s[j]
   s[j] = t
   i++
   j--
  }
  if s[i] != 'a' && s[i] != 'e' && s[i] != 'i' && s[i] != 'o' && s[i] != 'u' && s[i] != 'A' && s[i] != 'E' && s[i] != 'I' && s[i] != 'O' && s[i] != 'U' {//i位置不为元音字母
   i++
  }
  if s[j] != 'a' && s[j] != 'e' && s[j] != 'i' && s[j] != 'o' && s[j] != 'u' && s[j] != 'A' && s[j] != 'E' && s[j] != 'I' && s[j] != 'O' && s[j] != 'U' {////i位置不为元音
   j--
  }
 }

执行结果

法1

//定义rebyt,传入参数为[]byte,用于处理不可更改 的string
func rebyt(s []byte) string {
 for i, j := 0len(s)-1; i < j; {
  if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u' || s[i] == 'A' || s[i] == 'E' || s[i] == 'I' || s[i] == 'O' || s[i] == 'U') && (s[j] == 'a' || s[j] == 'e' || s[j] == 'i' || s[j] == 'o' || s[j] == 'u' || s[j] == 'A' || s[j] == 'E' || s[j] == 'I' || s[j] == 'O' || s[j] == 'U') {//判断两者都等于元音字母
   t := s[i]
   s[i] = s[j]
   s[j] = t
   i++
   j--
  }
  if s[i] != 'a' && s[i] != 'e' && s[i] != 'i' && s[i] != 'o' && s[i] != 'u' && s[i] != 'A' && s[i] != 'E' && s[i] != 'I' && s[i] != 'O' && s[i] != 'U' {//i位置不为元音字母
   i++
  }
  if s[j] != 'a' && s[j] != 'e' && s[j] != 'i' && s[j] != 'o' && s[j] != 'u' && s[j] != 'A' && s[j] != 'E' && s[j] != 'I' && s[j] != 'O' && s[j] != 'U' {////i位置不为元音
   j--
  }
 }
 return string(s)
}

func reverseVowels(s string) string {
 return rebyt([]byte(s))
}

执行用时: 4 ms , 在所有 Go 提交中击败了 79.29% 的用户 内存消耗: 3.8 MB , 在所有 Go 提交中击败了 99.49% 的用户 通过测试用例: 480 / 480

优化方案

我们可以用strings.Contains函数来 代替复杂的逻辑语句,它的作用就是循环对比s[i]中是否等于前面的哪个字符串中的 某个字符,返回bool数据

func reverseVowels(s string) string {
    t := []byte(s)
    n := len(t)
    i, j := 0, n-1
    for i < j {
        for i < n && !strings.Contains("aeiouAEIOU"string(t[i])) {
            i++
        }
        for j > 0 && !strings.Contains("aeiouAEIOU"string(t[j])) {
            j--
        }
        if i < j {
            t[i], t[j] = t[j], t[i]
            i++
            j--
        }
    }
    return string(t)
}

执行用时: 0 ms , 在所有 Go 提交中击败了 100.00% 的用户 内存消耗: 3.8 MB , 在所有 Go 提交中击败了 87.88% 的用户 通过测试用例: 480 / 480

分类:

后端

标签:

Golang

作者介绍

j
jaryue
V1