字符串相似度比较工具
描述:在日常开发过程中我们可能需要比较两个字符串的相似度有多少,本工具类提供了一个方便计算的算法。
/**
* 字符串相似度比较工具
*
* @date: 2020/12/7 10:45
*/
public class SimilarityCompareUtil {
private static int similarityCompare(String str, String target) {
// 首先定义一个矩阵d
int[][] d;
//获取源字符串的长度
int strLength = str.length();
//获取目标字符串的长度
int targetLength = target.length();
//定义用来遍历源(str)字符串的临时变量 i
int i;
//定义用来遍历目标(target)字符串的临时变量 j
int j;
//定义用来存储源字符串的字符变量 strChar
char strChar;
//定义用来存储目标字符串的字符变量 targetChar
char targetChar;
// 记录相同字符,在某个矩阵位置值的增量,不是0就是1
int temp;
//如果源字符串长度为零 则相似度为目标字符串长度值
if (strLength == 0) {
return targetLength;
}
//如果目标字符串长度为零 则相似度为源字符串长度值
if (targetLength == 0) {
return strLength;
}
//初始化矩阵大小
d = new int[strLength + 1][targetLength + 1];
// 初始化第一列
for (i = 0; i <= strLength; i++) {
d[i][0] = i;
}
// 初始化第一行
for (j = 0; j <= targetLength; j++) {
d[0][j] = j;
}
// 遍历str
for (i = 1; i <= strLength; i++) {
strChar = str.charAt(i - 1);
// 去匹配target
for (j = 1; j <= targetLength; j++) {
targetChar = target.charAt(j - 1);
if (strChar == targetChar || strChar == targetChar + 32 || strChar + 32 == targetChar) {
temp = 0;
} else {
temp = 1;
}
// 左边+1,上边+1, 左上角+temp取最小
d[i][j] = min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + temp);
}
}
return d[strLength][targetLength];
}
private static int min(int one, int two, int three) {
return (one = Math.min(one, two)) < three ? one : three;
}
/** 获取两字符串的相似度 */
public static float getSimilarity(String str, String target) {
return 1 - (float) similarityCompare(str, target) / Math.max(str.length(), target.length());
}
public static void main(String[] args) {
String str = "赣AWT001";
String target = "赣AW1002";
System.out.println("相似度=" + getSimilarity(str, target));
}
}