В статье Википедии о расстоянии Левенштейна говорится: возможные модификации, что «[мы] можем хранить количество вставок, удалений и замен отдельно».
Как это делается? Я создал реализацию матричного решения динамического программирования, описанного в статье, где каждая ячейка матрицы имеет отдельное значение для удалений/вставок/замен, но, хоть убей, я не могу понять логику.
Интуитивно кажется, что если мне нужно выполнить удаление и вставку на одном шаге, то вместо этого они должны стать заменой.
Чтобы полностью прояснить, что я хочу, вот образец матрицы для исходной строки «mat» и целевой строки «catch». Я ожидаю, что для этого потребуется одна замена (т. е. замена «m» на «c») и две вставки (т. е. добавление «ch»). Каждая ячейка — это «удаления/вставки/замены».
C A T C H +-----+-----+-----+-----+-----+-----+ |D/I/S|0/1/0|0/2/0|0/3/0|0/4/0|0/5/0| +-----+-----+-----+-----+-----+-----+ M |1/0/0|0/0/1|0/1/1|0/2/1|0/3/1|0/4/1| +-----+-----+-----+-----+-----+-----+ A |2/0/0|1/0/1|0/0/1|0/1/1|0/2/1|0/3/1| +-----+-----+-----+-----+-----+-----+ T |3/0/0|2/0/1|1/0/1|0/0/1|0/1/1|0/2/1| +-----+-----+-----+-----+-----+-----+
Кто-нибудь разрабатывал этот алгоритм?