Ctrl K

Склеить в палиндром

Сложная
Дан список **различных** слов words. Найдите все упорядоченные пары индексов [i, j], где i != j, такие что склейка words[i] + words[j] читается одинаково слева направо и справа налево. Порядок внутри пары важен: [i, j] и [j, i] — разные склейки, и каждая попадает в ответ, только если сама даёт палиндром. Сами пары можно вернуть в любом порядке. Перебор всех пар работает за O(n² · L). Попробуйте найти решение, время которого зависит от суммарной длины слов, а не от квадрата их количества.
Пример 1
words=['ten', 'net', 'noon', 'on'] → [[0, 1], [1, 0]]

«ten» + «net» = «tennet» и «net» + «ten» = «netten» читаются одинаково в обе стороны. «noon» и «on» палиндрома не дают ни в каком порядке, так что ответ — [0, 1] и [1, 0].

Пример 2
words=['lev', 'el', 'ab', 'xyzba'] → [[0, 1]]

«lev» + «el» = «level» — палиндром, пара [0, 1]. Ни «abxyzba», ни «xyzbaab» палиндромами не являются, так что ответ — только [[0, 1]].

Пример 3
words=['', 'aba', 'c'] → [[1, 0], [0, 1], [2, 0], [0, 2]]

Пустая строка приклеивается к любому палиндрому с обеих сторон: [0, 1], [1, 0], [0, 2], [2, 0].

Ограничения
  • 1 ≤ len(words) ≤ 5000
  • 0 ≤ len(words[i]) ≤ 300
  • Слова состоят из строчных латинских букв
  • Все слова различны
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиВсе способы расставить пробелы СложнаяСлова для головоломок СложнаяЧистка папок-близнецов СложнаяРазбиение на слова из словаря СредняяПодсветить найденное Средняя
загружаем Python…
Вход
words=['ten', 'net', 'noon', 'on']
Ожидается
[[0, 1], [1, 0]]

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