levenshtein() 計算兩個字串之間的編輯距離
levenshtein(string str1, string str2,int insert,int replace,int delete):int
編輯距離,是指兩個字串之間,通過替換、插入、刪除等操作將字串str1
轉換成str2
所需要操作的最少字元數量。 該演算法的複雜度是 O(m * n),其中 n 和 m 分別是str1
和str2
的長度 (當和演算法複雜度為 O(max(n,m)**3) 的 similar_text()
相比時,此函式還是相當不錯的,儘管仍然很耗時。)。
在最簡單的形式中,該函式只以兩個字串作為引數,並計算通過插入、替換和刪除等操作將str1
轉換成str2
所需要的操作次數。
第二種變體將採用三個額外的引數來定義插入、替換和刪除操作的次數。此變體比第一種更加通用和適應,但效率不高。
引數 | 說明 |
---|---|
str1 | 必需。需要比較的第一個字串。 |
str2 | 必需。需要比較的第二個字串。 |
insert | 可選。插入一個字元的成本。預設是 1。 |
replace | 可選。替換一個字元的成本。預設是 1。 |
delete | 可選。刪除一個字元的成本。預設是 1。 |
返回值:
此函式返回兩個字串引數之間的編輯距離,如果其中一個字串引數長度大於限制的255個字元時,返回-1。
$input = 'carrrot';
$words = ['apple','pineapple','banana','orange','radish','carrot'];
$shortest = -1;
foreach ($words as $word) {
$lev = levenshtein($input,$word);
if ($lev == 0) { //完全匹配
$closest = $word;
$shortest = 0;
break;
}
// 如果此次距離比上次找到的要短
// 或者還沒找到接近的單詞
if ($lev <= $shortest || $shortest < 0) {
$closest = $word;
$shortest = $lev;
}
}
echo 'input word:<br>';
if ($shortest == 0) {
echo 'exact match found:'.$closest.'<br>';
} else {
echo 'did you mean: '.$closest.'<br>';
}
// input word:
// did you mean: carrot
本作品採用《CC 協議》,轉載必須註明作者和本文連結