1. 编辑距离定义
今天我们来研究一个有趣的算法题,叫做字符串编辑距离。编辑距离研究的问题和最长公共子序列有相似之处,都是比较两个字符串之间的相似性,只是采用的标准不太相同。
先给出编辑距离的定义:设A和B是2个字符串,要用最少的字符操作将字符串A转换为字符串B。这里所说的字符操作包括:
(1)删除一个字符(delete);
(2)插入一个字符(insert);
(3)将一个字符改为另一个字符(substitute)。
将字符串A变换为字符串B所用的最少字符操作数称为字符串A到B的编辑距离(edit distance)。通常情况下,三种操作的代价是一样的,也即每种字符操作都会导致一次变换,这也符合我们平常的认知。但是,有时也可以对这三种操作施加不同的影响因子,使算法倾向于某种变换,可以通过修改三种操作的代价来实现。
事实上,也可以包含更多的字符操作。例如,在英文输入的过程中经常会出现不小心交换两个字符的问题(trueàture),所以可以增加一个新的操作—置换(transposition),表示互换相邻的两个字符,此时编辑距离升级为Damerau–Levenshteindistance距离,它包含插入、删除、替换和置换四种操作。在OCR应用中还存在其他操作:将两个字符合并(merge)成一个或者将一个字符展开(split)成两个。当然,也可以减少字符操作,例如求两个等长字符串的汉明距离只用到了替换操作;还有,在求最长公共子序列(LCS)的问题中