Скажем, что и b 1 b 2 … b n - две строки одинаковой длины. Anagramming из двух строк является взаимно однозначное отображение р : [ 1 ... п ] → [ 1 ... п ] такое , что я = Ь р ( я ) для каждого I .
Для одной пары строк может быть несколько анаграмм. Например, если `abcab` и b =, мы имеем p 1 [ 1 , 2 , 3 , 4 , 5 ] → [ 4 , 5 , 1 , 2 , 3 ] и p 2 [ 1 , 2 , 3 , 4 , 5 ] → [ 2 , 5 , 1cabab
, среди прочих.
Мы скажем, что вес анаграммирования p - это количество срезов, которые нужно сделать в первой строке, чтобы получить куски, которые можно переставить, чтобы получить вторую строку. Формально это число значений i ∈ [ 1 … n - 1 ], для которых p ( i ) + 1 ≠ p ( i + 1 ) . То есть, это количество точек , в которых р вовсе не увеличивает ровно 1.For например, ш ( р и w ( p 2 ) = 4 , потому что p 1 разрезаетодин раз на кускии, а p 2 разрезаетчетыре на пять кусков.12345
123
45
12345
Предположим, что существует анаграммирование для двух строк и b . Тогда хотя бы одно анаграммирование должно иметь наименьший вес. Скажем так, этот самый легкий . (Может быть несколько самых легких анаграммингов; мне все равно, потому что меня интересуют только веса.)
Вопрос
Я хочу алгоритм, который, учитывая две строки, для которых существует анаграммирование, эффективно дает точный вес самого легкого анаграммирования двух строк. Это нормально, если алгоритм также дает легчайшее анаграммирование, но это не обязательно.
Довольно просто сгенерировать все анаграммы и взвесить их, но их может быть много, поэтому я бы предпочел метод, который напрямую находит анаграммы света.
мотивация
Причина, по которой эта проблема представляет интерес, заключается в следующем. Очень легко заставить компьютер искать в словаре и находить анаграммы, пары слов, которые содержат одинаковые буквы. Но многие из произведенных анаграмм неинтересны. Например, самые длинные примеры, которые можно найти во Втором международном словаре Вебстера:
холецистодуоденостомия
дуоденохолецистостомия
Проблема должна быть ясно: это неинтересно , потому что они допускают очень легкий anagramming , что просто обменивает cholecysto
, duedeno
и stomy
секции, для веса 2. С другой стороны, это намного короче пример гораздо более удивительным и интересным:
береговая линия в
разрезе
Здесь самый легкий анаграмминг имеет вес 8.
У меня есть программа, которая использует этот метод для поиска интересных анаграмм, а именно тех, для которых все анаграммы имеют большой вес. Но он делает это, генерируя и взвешивая все возможные анаграммы, что очень медленно.
cholecystoduodenostomy
is ccddeehlmnooooossttuyy
.) Два слова являются анаграммами тогда и только тогда, когда они имеют одинаковую каноническую форму. Вы сохраняете слова в хеш-таблице, обозначенные их каноническими формами, и всякий раз, когда вы обнаруживаете столкновение, у вас появляется анаграмма.