Задача, которую дают на собеседованиях кандидатам, которые будут работать с текстом, например в разработке поисковых систем.

 Задача, которую дают на собеседованиях кандидатам, которые будут работать с текстом, например в разработке поисковых систем.

https://t.me/pythonl

Условие:

Дан массив со словами, в котором есть хотя бы одно слово. Необходимо найти максимально длинное общее начало каждого слова. Если такого нет — вывести пустую строку.


Например: имеем ['дог', 'домен', 'домра', 'доширак']. Общее начало каждого слова — 'до'.


Другой пример: массив ['документ', 'кот', 'кум', 'ум']. 

Ответом будет пустая строка, потому что у всех этих слов нет единой общей части в начале слова.


Для хитрого решения нам понадобятся две функции — zip(*) и set().

Функция zip(*) берёт список и формирует из него много других списков, складывая их так: первый элемент к первому, второй ко второму и так далее. Покажем работу на примере нашего списка:

  1. Функция возьмёт из него все слова по отдельности: 'дом', 'домен', 'домра', 'доширак'.
  2. Возьмёт первую букву каждого слова и составит из них отдельный список: {'д','д','д','д'}.
  3. Потом возьмёт вторую букву каждого слова и составит список уже из них: {'о','о','о','о'}.
  4. Так она будет делать до тех пор, пока не закончатся буквы в самом коротком слове. Как только хоть одно слово закончилось — функция заканчивает работу.

Получается, что так мы можем получить сразу все сгруппированные буквы по порядку каждого слова. Теперь нам нужно проверить, разные там буквы в этих списках или нет. Если все буквы одинаковые, значит, они подходят к каждому слову, и значит, что их можно добавить к ответу. Если есть хоть одна отличающаяся буква — всё, общее начало на этом закончилось.

Чтобы такое проверить, используем функцию 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))

Источник

Report Page