/**
* 计算两个字符串之间的编辑距离【支持多字节字符串】
*
* @param string $str1 求编辑距离中的其中一个字符串
* @param string $str2 求编辑距离中的另一个字符串
*
* @return int
*/
function levenshtein_copy(string $str1, string $str2): int
{
$arr1 = mb_str_split($str1);
$arr2 = mb_str_split($str2);
$len1 = count($arr1);
$len2 = count($arr2);
$num = 0; // 最小编辑距离
$len = $len1 > $len2 ? $len1 : $len2; // 最长字符串长度
// 删除相同字符
for ($i = 0, $a = 0; $i < $len1; ++$i) {
for ($j = $a; $j < $len2; ++$j) {
if (isset($arr1[$i]) && isset($arr2[$j]) && $arr1[$i] === $arr2[$j]) {
$a = $j;
unset($arr1[$i]);
unset($arr2[$j]);
break;
}
}
}
// 计算最小编辑距离
for ($i = 0; $i < $len; ++$i) {
if (isset($arr1[$i]) && isset($arr2[$i])) {
++$num; // 替换
} elseif (isset($arr1[$i])) {
++$num; // 删除
} elseif (isset($arr2[$i])) {
++$num; // 插入
}
}
return $num;
}
v(levenshtein_copy('bbcde', 'abdbe'));
v(levenshtein_copy('吉林宝源', '林宝源丰'));
执行结果: