victory的博客

长安一片月,万户捣衣声

0%

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

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

题目描述

给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串。
元音字母包括 ‘a’、’e’、’i’、’o’、’u’,且可能以大小写两种形式出现。

题目链接+

思路

  1. 先将字符串中的元音字母的位置找出来,然后再将各元音字母反转

  2. 双指针
    我们可以使用两个指针 i 和 j 对字符串相向地进行遍历。
    具体地,指针 i 初始时指向字符串 s 的首位,指针 j 初始时指向字符串 s 的末位。在遍历的过程中,我们不停地将 i 向右移动,直到 i 指向一个元音字母(或者超出字符串的边界范围);同时,我们不停地将 j 向左移动,直到 j 指向一个元音字母。此时,如果 i<j,那么我们交换 i 和 j 指向的元音字母,否则说明所有的元音字母均已遍历过,就可以退出遍历的过程。

    代码

    class Solution:

     def reverseVowels(self, s: str) -> str:
         """
         find ans reverse
         :param s:
         :return:
         """
         vowels = list()
         s = list(s)
         for i in range(len(s)):
             ch = s[i].lower()
             if ch == 'a' or ch == 'e' or ch == 'i' or ch == 'o' or ch == 'u':
                 vowels.append(i)
    
         for i in range(len(vowels)//2):
             s[vowels[i]], s[vowels[len(vowels) - i -1]] = s[vowels[len(vowels) - i -1]], s[vowels[i]]
    
         return ''.join(s)
    
     def reverseVowels1(self, s: str) -> str:
         """双指针"""
         def isVowel(ch: str) -> bool:
             return ch in "aeiouAEIOU"
    
         n = len(s)
         s = list(s)
         i, j = 0, n - 1
         while i < j:
             while i < n and not isVowel(s[i]):
                 i += 1
             while j > 0 and not isVowel(s[j]):
                 j -= 1
             if i < j:
                 s[i], s[j] = s[j], s[i]
                 i += 1
                 j -= 1
    
         return ''.join(s)
    

    if name == “main“:

     s = Solution()
     string = "hello"
     res = s.reverseVowels(string)
     print(res)