Скажіть, що і 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
є ccddeehlmnooooossttuyy
.) Два слова є анаграмами тоді і лише тоді, коли вони мають однакову канонічну форму. Ви зберігаєте слова в хеш-таблиці, введені їх канонічними формами, і коли ви виявите зіткнення, у вас є анаграма.