Самая длинная полная подпоследовательность упорядоченных гласных

Дана строка, состоящая из «a», «e», «i», «o» или «u», найдите самую длинную подпоследовательность гласных по порядку. Например, если строка — «aeiaeiou», то ответ — 6, что делает подпоследовательность «aaeiou». Другой пример: «aeiaaioooaauuaeiou», где ответ — 10. Полная подпоследовательность означает, что вам нужно расположить все гласные по порядку: a -> e -> i -> o -> u, но вы можете иметь повторы гласных, например «ааааааааааа» действительно. Если такой подпоследовательности не существует, верните 0.

Я придумал подход DP O(n^2), и мне интересно, есть ли более быстрая версия для этой проблемы.

def find_longest_dp(vowels):
    n = len(vowels)
    dp = [[0, False] for _ in range(n)]
    prev_vowel = {"a": None, "e": "a", "i": "e", "o": "i", "u": "o"}

    for i in range(n):
        if vowels[i] == "a":
            dp[i] = [1, True]
        
        for j in range(i):
            if dp[j][1] and vowels[j] in {vowels[i], prev_vowel[vowels[i]]}:
                dp[i][0] = max(dp[i][0], dp[j][0] + 1)
                dp[i][1] = True
    
    return max((dp[i][0] for i in range(n) if vowels[i] == 'u'), default=0)

Этот вопрос похож на: Самая длинная упорядоченная подпоследовательность гласных — динамическое программирование. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.

sahasrara62 27.08.2024 07:48

@RobbyCornelissen, вот полная проблема leetcode.com/problems/longest-substring-of-all-vowels-in-ord‌​er/…

sahasrara62 27.08.2024 07:53

@RobbyCornelisse Подпоследовательность, а не подстрока (непрерывная)

MBo 27.08.2024 07:54

@ sahasrara62 Но проблема с литкодом связана с смежными подстроками

MBo 27.08.2024 07:55

@RobbyCornelissen Нет, вопрос не лишен ясности. Подпоследовательность — это очень четко определенный термин, и ФП никогда не утверждает, что вопрос исходит из лит-кода.

blhsing 27.08.2024 08:00

Что означает слово «полный» в вашем названии? Ничего подобного в приведенной спецификации нет.

no comment 27.08.2024 10:23

Расскажите, что означает dp[i], чтобы лучше понять ваш код.

no comment 27.08.2024 10:25

А если «полный» означает, что все пять гласных должны появиться в подпоследовательности, то что, если такой подпоследовательности не существует? Тогда ваш код возвращает 0, но этого нет в указанной спецификации.

no comment 27.08.2024 10:39

Добавлен некоторый контекст в мой вопрос, но «полный» означает, что подпоследовательность должна содержать все [a, e, i, o, u] и они должны быть упорядочены. Что-то вроде «aaaeeioou» допустимо, а «aeiuo» — нет.

John Doe 27.08.2024 18:12
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
9
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

O(n), отслеживая максимальную длину каждой последней гласной подпоследовательности (например, maxlen[3] сообщает максимальную длину упорядоченной подпоследовательности, заканчивающейся на «o»):

def find_longest_dp2(vowels):
    maxlen = [0] * 5
    for v in vowels:
        i = 'aeiou'.find(v)
        maxlen[i] = max(maxlen[:i+1]) + 1
    return max(maxlen)

Или, если все пять гласных должны находиться в подпоследовательности (как предполагает слово «полный» в вашем названии), и вы хотите 0, если такой подпоследовательности не существует (как предполагает ваш код):

def find_longest_dp3(vowels):
    maxlen = [0] + [float('-inf')] * 5
    for v in vowels:
        i = '.aeiou'.find(v)
        maxlen[i] = max(maxlen[i-1:i+1]) + 1
    return max(maxlen[5], 0)

Попробуйте это онлайн!с тестированием.

Спасибо, find_longest_dp3 это то, что я искал - отличная реализация.

John Doe 27.08.2024 18:10

Другие вопросы по теме

Есть ли способ получить проекцию на заархивированные векторы std::tuple без лямбды?
Как оптимально разместить две точки на числовой прямой, чтобы минимизировать общее расстояние до набора заданных точек
Есть ли в этом алгоритме преобразования двоичного дерева поиска в отсортированный связанный список в Википедии ошибка?
Почему на этапе разделения быстрой сортировки используется одно условие остановки с двумя указателями L и R, а (L <= R)? Может ли это быть пока (L < R)?
Учитывая двоичную строку, подсчитайте количество плотных подстрок за время O (nlogn)
Диаметр двоичного дерева — неудачный случай, когда самый длинный путь не проходит через корень
Реализация Java, проблема производительности алгоритма Динича
Эффективный алгоритм сортировки 2d точек в набор границ Парето
Крупнейший продукт в сетке «Не в том же направлении»
Как рассчитать максимальный параллелизм узлов в DAG?