在TypeScript中,可以使用Levenshtein莱文斯坦距离算法来精确匹配两个字符串的相似度百分比。
一、莱文斯坦距离算法介绍
莱文斯坦距离(LD)用于衡量两个字符串之间的相似度。 以下我们称这两个字符串分别为A和B。莱文斯坦距离被定义为''将字符串A变换为字符串B所需的删除、插入、替换操作的次数''。
定义:
在数学上,两个字符串a,b的莱文斯坦距离记作
数学的公式如下:
表示内容:
代码表示:
dp[i][j] = min(
dp[i-1][j] + 1, // 插入操作
dp[i][j-1] + 1, // 删除操作
dp[i-1][j-1] + cost // 替换操作
)
/**
* Levenshtein距离算法来精确匹配两个字符串的相似度
* Levenshtein距离是指两个字符串之间,由一个转换成另一个所需的最少编辑操作次数,这里的编辑操作包括插入、删除、替换
*/
function levenshteinDistance(str1: string, str2: string): number {
let m = str1.length;
let n = str2.length;
let dp: number[][] = new Array(m + 1).fill(0).map(() => new Array(n + 1).fill(0));
for (let i = 0; i <= m; i++) {
dp[i][0] = i;
}
for (let j = 0; j <= n; j++) {
dp[0][j] = j;
}
for (let i = 1; i <= m; i++) {
for (let j = 1; j <= n; j++) {
if (str1[i - 1] === str2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1];
} else {
dp[i][j] = 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
}
}
}
return dp[m][n];
}
//根据两字符串的最大长度和计算得到的Levenshtein距离来计算相似度百分比
function calculateSimilarityPercentage(str1: string, str2: string): number {
const maxLength = Math.max(str1.length, str2.length);
const distance = levenshteinDistance(str1, str2);
return 1 - distance / maxLength;
}
调用:
const queryAndSort = (word: string, targetWord: string) => {
return calculateSimilarityPercentage(word, targetWord);
};
console.log(queryAndSort1("byte_id", "id"), "------------"); // 0.2857142857142857
console.log(queryAndSort1("byte_id", "byte_id"), "------------");// 1
通过这种方式实现的字符串相似度是比较准确的。无论是匹配中文、英文、还是中英结合的、或者正序倒序的都可以正确匹配出来~