345. Reverse Vowels of a String

Обновлено: 2024-03-12
2 мин
[]

LeetCode задача 345

Задача

Задана строка s. Необходимо перевернуть только гласные буквы в этой строке и вернуть результат.

Гласные буквы: 'a', 'e', 'i', 'o', 'u'. Они могут встречаться в верхнем и нижнем регистрах, и более одного раза.

Подсказки

Для решения задачи можно использовать два указателя: один с начала строки, другой с конца. Затем можно двигаться этими указателями к центру строки, меняя местами гласные буквы.

Подход

Используем два указателя для итерации по строке: один с начала (left), другой с конца (right). Двигаем их к центру, меняя местами гласные буквы, которые они встречают.

Алгоритм

  1. Инициализируем два указателя: left на начало строки, right на конец.
  2. Конвертируем строку в список для удобства манипуляций.
  3. Пока left < right:
    1. Находим следующую гласную букву с начала, двигая left вправо.
    2. Находим следующую гласную букву с конца, двигая right влево.
    3. Меняем местами гласные буквы.
  4. Возвращаем преобразованный список как строку.

Решение

def reverseVowels(s: str) -> str:
    vowels = set("aeiouAEIOU")  # Создадим множество гласных букв для быстрого поиска
    s_list = list(s)  # Преобразуем строку в список
    
    left, right = 0, len(s) - 1  # указатели
    
    while left < right:
        # Находим следующую гласную с начала строки
        while left < right and s_list[left].lower() not in vowels:
            left += 1
            
        # Находим следующую гласную с конца строки
        while left < right and s_list[right].lower() not in vowels:
            right -= 1
            
        # Меняем гласные местами
        s_list[left], s_list[right] = s_list[right], s_list[left]
        
        # Двигаем указатели
        left += 1
        right -= 1
    
    return "".join(s_list)