/**
* @Description: 字符串相似度计算
* @Author: wm
* @LastModifyDate:
* @LastModifyBy:
* @Version:
*/
public class StringSimilarityCalculatorUtils {
/**
* 计算两个字符串的相似度
* @param str1 第一个字符串
* @param str2 第二个字符串
* @return 两个字符串的相似度(百分比形式)
*/
public static double calculateSimilarity(String str1, String str2) {
int maxLength = Math.max(str1.length(), str2.length()); // 计算两个字符串的最大长度
int distance = calculateLevenshteinDistance(str1, str2); // 计算两个字符串的编辑距离
double similarity = (double) (maxLength - distance) / maxLength * 100; // 计算相似度
// 取消小数位
return (int) similarity;
}
/**
* 计算两个字符串之间的Levenshtein距离
* @param str1 第一个字符串
* @param str2 第二个字符串
* @return 两个字符串之间的Levenshtein距离
*/
private static int calculateLevenshteinDistance(String str1, String str2) {
int[] dp = new int[str2.length() + 1];
for (int j = 0; j <= str2.length(); j++) {
dp[j] = j;
}
for (int i = 1; i <= str1.length(); i++) {
int prev = dp[0];
dp[0] = i;
for (int j = 1; j <= str2.length(); j++) {
int current = dp[j];
if (str1.charAt(i - 1) == str2.charAt(j - 1)) {
dp[j] = prev;
} else {
dp[j] = 1 + Math.min(prev, Math.min(dp[j - 1], dp[j]));
}
prev = current;
}
}
return dp[str2.length()];
}
public static void main(String[] args) {
String str1 = "测试";
String str2 = "测试题";
double similarity = calculateSimilarity(str1, str2);
//Similarity: 66.0%
System.out.println("Similarity: " + similarity + "%");
}
}
练习时候写的,一个比较字符串相似度的方法, 用于比较 字符串A和字符串B的相似度 ,
如测试用例中比中为例
测试 与 测试题为基准 进行比较 ,
则其相似度为 66%