Ctrl K

Зеркальные блоки из слов

Сложная
Дан список различных слов vocabulary одинаковой длины k. Сложим k слов в столбик, по одному в строке, — получится квадрат букв k × k. Назовём его **зеркальным блоком**, если i-я строка совпадает с i-м столбцом (читаемым сверху вниз) для каждого i. Иначе говоря, квадрат симметричен относительно главной диагонали. Одно и то же слово можно ставить в блок сколько угодно раз. Верните все зеркальные блоки, которые можно составить из слов vocabulary; каждый блок — список слов по строкам сверху вниз. Порядок блоков в ответе любой, порядок строк внутри блока важен.
Пример 1
vocabulary=['card', 'area', 'rear', 'dart', 'cart'] → [['card', 'area', 'rear', 'dart']]

Строки card, area, rear, dart: первый столбец читается как card, второй — area, третий — rear, четвёртый — dart. С cart блок не достроить: четвёртая строка должна начинаться на tar, а такого слова нет.

Пример 2
vocabulary=['ab', 'ba', 'bb'] → [['ab', 'ba'], ['ab', 'bb'], ['ba', 'ab'], ['bb', 'ba'], ['bb', 'bb']]

Для k = 2 достаточно, чтобы вторая строка начиналась со второй буквы первой. Получается пять блоков: ab/ba, ab/bb, ba/ab, bb/ba, bb/bb. Слово можно повторять.

Пример 3
vocabulary=['xy', 'zw'] → []

После xy нужна строка на y, после zw — на w; таких слов нет, ответ пустой.

Ограничения
  • 1 ≤ len(vocabulary) ≤ 1000
  • 1 ≤ k ≤ 5, все слова одной длины k
  • Слова состоят из строчных латинских букв
  • Все слова различны
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиВсе способы расставить пробелы СложнаяСлова в буквенной сетке СложнаяСклеить в палиндром СложнаяКратчайшее однозначное сокращение СложнаяСлова из других слов Сложная
загружаем Python…
Вход
vocabulary=['card', 'area', 'rear', 'dart', 'cart']
Ожидается
[['card', 'area', 'rear', 'dart']]

«Запустить» — первые 3 теста у тебя в браузере, «Отправить» — все 33 теста на сервере, включая скрытые.