Задача с собеседования в FourKitesДан строковый массив words и бинарный массив groups, оба длины n.
Подпоследовательность words называется
чередующейся, если для любых двух соседних строк в этой последовательности соответствующие элементы в groups (по тем же индексам) различаются (то есть не может быть двух подряд идущих 0 или двух подряд идущих 1).
Ваша задача - выбрать
самую длинную чередующуюся подпоследовательность из words.
Верните выбранную подпоследовательность. Если существует несколько ответов, верните любой из них.
Обратите внимание, что элементы в words различны.
Пример 1: Input: words = ["e","a","b"], groups = [0,0,1]
Output: ["e","b"]
Explanation: Подпоследовательность ["e", "b"] подходит, так как groups[0] != groups[2]. Другая подходящая подпоследовательность - это ["a", "b"], так как groups[1] != groups[2]. Можно продемонстрировать, что длина самой длинной подпоследовательности индексов, удовлетворяющей условию, равна 2.
Пример 2:Input: words = ["a","b","c","d"], groups = [1,0,1,1]
Output: ["a","b","c"]
Explanation: Подпоследовательность ["a", "b", "c"] подходит, так как groups[0] != groups[1] и groups[1] != groups[2]. Другая подходящая подпоследовательность - ["a", "b", "d"], так как groups[0] != groups[1] и groups[1] != groups[3]. Можно продемонстрировать, что длина самой длинной подпоследовательности индексов, удовлетворяющей условию, равна 3.
Ограничения:1 <= n == words.length == groups.length <= 100
1 <= words[i].length <= 10
groups[i] равно либо 0, либо 1.
words состоит из различных строк.
words[i] состоит из строчных английских букв.
НАШ ЧАТ АЛГОРИТМИСТОВРешение Ещё одна разминочная задачка.
Используем жадный алгоритм:
Берём первый эл-т массива words в результирующий массив, это всегда оптимально, так как:
- Если оптимальная подпоследовательность начиналась бы с более позднего эл-та этой же группы, его можно было бы заменить на words[0] без потери длины.
- Если же подпоследовательность начиналась бы с другой группы, добавление words[0] в начало сделало бы её ещё длиннее.
Таким образом, потенциальные точки смены группы не пропускаются.
Подпоследовательность продляется, только когда группа меняется (с 0 на 1 или с 1 на 0). Значит, если алгоритм будет "жадно" брать эл-т в момент смены группы, будут взяты все возможные эл-ты (каждая смена группы, соответственно, даёт максимум один эл-т) => построена самая длинная чередующаяся подпоследовательность (1 + кол-во смен группы в исходном массиве).
Создаём массив res, состоящий из words[0].
Проходим по словам и соответствующим им группам:
- если текущая группа groups[i] не равна предыдущей (эквивалентно: не равна группе последнего взятого эл-та), произошла смена группы: добавляем слово под этим же индексом в res.
Возвращаем результирующий массив.Сложность O(n) - по времени (проходим по массиву words длиной n)
O(n) - по памяти (для хранения res)Кодclass Solution:
def getLongestSubsequence(self, words: List[str], groups: List[int]) -> List[str]:
res = [words[0]]
for i in range(1, len(words)):
if groups[i] != groups[i - 1]:
res.append(words[i])
return res @algoses