как преобразовать строку в палиндром с минимальным количеством операций?

здесь состояния для преобразования строки в палиндром с минимальным количеством операций. Я знаю, что это похоже на расстояние Левенштейна но я пока не могу ее решить!--7-->

например, для ввода mohammadsajjadhossain выход 8.

2 ответов


выполните расстояние Левенштейна на строке и ее обратном направлении. Решением будет минимум операций в диагонали массива DP, идущей снизу-слева-сверху-справа, а также каждая запись чуть выше и чуть ниже диагонали.

это работает, потому что записи по диагонали представляют минимальные изменения, необходимые для того, чтобы сделать первые I и последние n-i символов строки равными, а записи чуть выше и чуть ниже представляют минимум для строк в конечном итоге с нечетной длиной, где средний (левый) символ не совпадает ни с чем.


вам просто нужно вычислить ограниченное количество расстояний Левенштейна, по одному для каждой возможной точки поворота палиндрома. Точка поворота может быть буквой или находиться между двумя буквами, поэтому строка длины n имеет 2n-1 точек поворота. Для каждой точки поворота вычисляется расстояние Левенштейна символов до точки поворота и обратное расстояние символов после нее:

(m)ohammadsajjadhossain: Levensthein("", "niassohdajjasdammaho")
m ohammadsajjadhossain: Levensthein("m", "niassohdajjasdammaho")
m(o)hammadsajjadhossain: Levensthein("m", "niassohdajjasdammah")
mo hammadsajjadhossain: Levensthein("mo", "niassohdajjasdammah")
mo(h)ammadsajjadhossain: Levensthein("mo", "niassohdajjasdamma")
moh ammadsajjadhossain: Levensthein("moh", "niassohdajjasdamma")
так далее.

теперь просто возьмите минимум этих расстояний. Если скорость важна, вы можете оптимизировать многие из этих вызовов.