Задача, которую дают на собеседованиях кандидатам, которые будут работать с текстом, например в разработке поисковых систем.
https://t.me/pythonlУсловие:
Дан массив со словами, в котором есть хотя бы одно слово. Необходимо найти максимально длинное общее начало каждого слова. Если такого нет — вывести пустую строку.
Например: имеем ['дог', 'домен', 'домра', 'доширак']. Общее начало каждого слова — 'до'.
Другой пример: массив ['документ', 'кот', 'кум', 'ум'].
Ответом будет пустая строка, потому что у всех этих слов нет единой общей части в начале слова.
Для хитрого решения нам понадобятся две функции — zip(*) и set().
Функция zip(*) берёт список и формирует из него много других списков, складывая их так: первый элемент к первому, второй ко второму и так далее. Покажем работу на примере нашего списка:
- Функция возьмёт из него все слова по отдельности: 'дом', 'домен', 'домра', 'доширак'.
- Возьмёт первую букву каждого слова и составит из них отдельный список: {'д','д','д','д'}.
- Потом возьмёт вторую букву каждого слова и составит список уже из них: {'о','о','о','о'}.
- Так она будет делать до тех пор, пока не закончатся буквы в самом коротком слове. Как только хоть одно слово закончилось — функция заканчивает работу.
Получается, что так мы можем получить сразу все сгруппированные буквы по порядку каждого слова. Теперь нам нужно проверить, разные там буквы в этих списках или нет. Если все буквы одинаковые, значит, они подходят к каждому слову, и значит, что их можно добавить к ответу. Если есть хоть одна отличающаяся буква — всё, общее начало на этом закончилось.
Чтобы такое проверить, используем функцию set() — она составит из переданных ей аргументов список с уникальными значениями. Если длина такого списка будет равна 1, значит, все переданные символы были одинаковые — и их можно добавлять к ответу.
Читайте комментарии, чтобы разобраться в этом хитром коде:
# исходный массив со строками strs = ['дом', 'домен', 'домра', 'доширак'] # функция, которая найдёт общее начало def longestCommonPrefix(strs): # на старте общее начало пустое prefix=[] # разбираем слова побуквенно в отдельные списки и перебираем их по очереди for x in zip(*strs): # смотрим, сколько уникальных элементов у нас получилось в наборе на этом этапе if len(set(x)) == 1: # если уникальный элемент один — добавляем его к общему началу prefix.append(x[0]) # если уникальных элементов было больше одного else: # прерываем цикл и выходим из него break # возращаем результат работы функции # если общее начало пустое, то на выходе получим тоже пустую строку return "".join(prefix) # выводим результат работы функции print(longestCommonPrefix(strs))