background image

levenshtein.c。
levenshtein()会根据参数个数选择实现方式,针对参数为 2 和参数为 5 的情况,都会调

 

用 reference_levdist() 函数计算距离。其不同在于对后三个参数,参数为 2 时,使用默
认值 1。

 

并且在实现源码中我们发现了一个在文档中没有说明的情况: levenshtein() 函数还可

 

以传递三个参数,其最终会调用 custom_levdist() 函数。它将第三个参数作为自定义函
数的实现,其调用示例如下:
代码如下:

echo levenshtein("Hello World","ello World", 'strsub');

执行会报 Warning  

: The general Levenshtein support is not there yet。这是因为

现在这个方法还没有实现,仅仅是放了一个坑在那。
reference_levdist() 函数的实现算法是一个经典的 DP 问题。
给定两个字符串 x 和 y,求最少的修改次数将 x 变成 y。修改的规则只能是如下三种之一:
删除、插入、改变。
用 a[i][j]表示把 x 的前 i 个字符变成 y 的前 j 个字符所需的最少操作次数,则状态转移方
程为:
代码如下:

当 x[i]==y[j]时:a[i][j] = min(a[i-1][j-1], a[i-1][j]+1, a[i][j-1]+1);
当 x[i]!=y[j]时:a[i][j] = min(a[i-1][j-1], a[i-1][j], a[i][j-1])+1;

在用状态转移方程前,我们需要初始化(n+1)(m+1)的矩阵 d,并让第一行和列的值从 0

 

开始增长。 扫描两字符串(nm 级的),对比字符,使用状态转移方程,最终$a[$l1]
[$l2]为其结果。
简单实现过程如下:

 

复制代码 代码如下:

<?PHP
$s1 = "abcdd";
$l1 = strlen($s1);
$s2 = "aabbd";
$l2 = strlen($s2);

for ($i = 0; $i < $l1; $i++) {
$a[0][$i + 1] = $i + 1;
}
for ($i = 0; $i < $l2; $i++) {
$a[$i + 1][0] = $i + 1;
}