Этот вопрос является расширением проверки, являются ли слова изоморфами, и копирует первую часть этого текста, чтобы дать определение изоморфа.
Два слова являются изоморфами, если они имеют одинаковый шаблон повторения букв. Например, оба ESTATE
и DUELED
имеют шаблонabcdca
ESTATE
DUELED
abcdca
потому что буквы 1 и 6 одинаковы, буквы 3 и 5 одинаковы и ничего более. Это также означает, что слова связаны шифром замещения, здесь с соответствием E <-> D, S <-> U, T <-> E, A <-> L
.
Для двух строк X и Y, причем X не длиннее Y, задача состоит в том, чтобы определить, существует ли подстрока Y, которая является изоморфной с X.
Входные данные: две непустые строки букв из a..zA..Z, по одной строке на строку. Это будет исходить из стандартного ввода.
Выходные данные Подстрока второй строки, которая является изоморфой первой строки, если такая вещь существует. В противном случае выведите «Нет!».
Правила Ваш код должен выполняться за линейное время от общей длины ввода.
Оценка Ваша оценка - это количество байтов в вашем коде. Побеждает несколько байтов.
Пример ввода и вывода
adca
ddaddabdaabbcc
dabd
Чаевые
Существует , по крайней мере один не , что сложно, практически быстро и линейное время решение этой проблемы.
Ответы:
Python 2,
338326323321310306297293290289280279266264259237230229226223222220219217 (260238231228225223221220218 с 0 статусом выхода)Алгоритм представляет собой вариант KMP, использующий основанный на индексе тест для сопоставления символов. Основная идея состоит в том, что если мы получим несоответствие в позиции,
X[i]
то мы можем вернуться к следующему возможному месту для совпадения в соответствии с самым длинным суффиксом,X[:i]
который изоморфен префиксуX
.Работая слева направо, мы присваиваем каждому символу индекс, равный расстоянию до самого последнего предыдущего появления этого символа, или, если предыдущее вхождение отсутствует, мы берем длину текущего строкового префикса. Например:
Чтобы проверить, совпадают ли два символа, мы сравниваем индексы, соответственно корректируя индексы, которые больше, чем длина текущей (под) строки.
Алгоритм KMP становится немного упрощенным, поскольку мы не можем получить несоответствие по первому символу.
Эта программа выводит первое совпадение, если оно существует. Я использую ошибку времени выполнения для выхода в случае совпадения, но код может быть легко изменен для чистого выхода за счет некоторых байтов.
Примечание: для вычисления индексов мы можем использовать
str.rfind
(в отличие от моего более раннего подхода с использованием словаря) и все еще иметь линейную сложность, предполагая, чтоstr.rfind
поиск начинается с конца (что кажется единственным разумным выбором реализации) - для каждого символа в алфавите нам никогда не придется проходить одну и ту же часть строки дважды, поэтому существует верхняя граница сравнений (размер алфавита) * (размер строки).Поскольку в ходе игры в гольф код был довольно запутан, вот более раннее (293 байтное) решение, которое немного легче читать:
В
e
функциональных тестах эквивалентность символов.exec
Оператор присваивает индексы и делает некоторые переменные инициализацыми. Первый цикл обрабатываетX
запасные значения, а второй - поиск строки.Обновление: вот версия, которая выходит чисто, по стоимости одного байта:
источник
r=raw_input
против r =input
экономит 4 байта, а парены на печать стоят только 3.exec
.Python 3, 401 байт
Это до сих пор в основном не одурачено, но я думаю, что это должно работать. Основным алгоритмом является KMP , плюс дополнительный фактор, который зависит от размера алфавита (что хорошо, поскольку алфавит постоянен). Другими словами, это / должен быть один совершенно непрактичный линейный алгоритм.
Вот несколько аннотаций, которые помогут с анализом:
Для тестирования вы можете заменить
s
на меньший алфавит, чемstring.ascii_letters
.источник
APL (Dyalog) , 32 байта
Это инфиксная функция, принимающая X в качестве левого аргумента и Y в качестве правого аргумента.
Попробуйте онлайн!
{
…}
Анонимная лямбда, где⍺
и⍵
представляют аргументы (X и Y)⍳⍨⍺
ɩ NDEX селфи Х ( ɩ ndices первого появления элементов X в X)⊂
приложить, чтобы мы могли искать всю эту модель(
...)⍳
Индекс первого появления этого в ...≢⍺
подсчет (длина) X⍵,/⍨
все подстроки этого размера Y (горит сокращение конкатенации тех, но это не является опцией)s←
хранить вs
(для з ubstrings)⍳⍨¨
selfie ndex селфи каждого из этихтеперь у нас есть индекс первого шаблона или 1 + количество шаблонов, если совпадений не найдено
(
...)⊃⍨
использовать этот индекс, чтобы выбрать из ...⊂'No!'
вложенная строка (чтобы она функционировала как отдельный элемент)s,
с добавлениемs
источник