Java两个字符串相似度判断

在实际编程中,我们经常需要比较两个字符串的相似度。例如,在搜索引擎中,我们需要根据用户的输入和数据库中的关键词进行匹配,找到相似度最高的结果。本文将介绍一种常用的方法——Levenshtein距离算法,用于计算两个字符串之间的相似度。

Levenshtein距离算法

Levenshtein距离算法,也称为编辑距离算法,是一种用于计算两个字符串之间的相似度的算法。它通过插入、删除和替换操作来将一个字符串转换成另一个字符串,操作的次数即为两个字符串之间的距离。距离越小,表示两个字符串越相似。

下面是Levenshtein距离算法的 Java 实现代码:

public class LevenshteinDistance {

    public static int calculate(String str1, String str2) {
        int[][] dp = new int[str1.length() + 1][str2.length() + 1];

        for (int i = 0; i <= str1.length(); i++) {
            dp[i][0] = i;
        }

        for (int j = 0; j <= str2.length(); j++) {
            dp[0][j] = j;
        }

        for (int i = 1; i <= str1.length(); i++) {
            for (int j = 1; j <= str2.length(); j++) {
                if (str1.charAt(i - 1) == str2.charAt(j - 1)) {
                    dp[i][j] = dp[i - 1][j - 1];
                } else {
                    dp[i][j] = Math.min(dp[i - 1][j - 1] + 1, Math.min(dp[i][j - 1] + 1, dp[i - 1][j] + 1));
                }
            }
        }

        return dp[str1.length()][str2.length()];
    }

    public static void main(String[] args) {
        String str1 = "kitten";
        String str2 = "sitting";

        int distance = calculate(str1, str2);

        System.out.println("The Levenshtein distance between \"" + str1 + "\" and \"" + str2 + "\" is: " + distance);
    }
}

在上述代码中,我们定义了一个 calculate 方法来计算两个字符串之间的 Levenshtein 距离。该方法使用动态规划的思想,通过一个二维数组 dp 来记录中间结果。最后,我们在 main 方法中调用 calculate 方法,并输出计算结果。

实例应用

接下来,我们通过一个示例来演示如何使用 Levenshtein 距离算法来判断两个字符串的相似度。

假设我们有一个关键词数据库,其中包含以下关键词:

  1. "cat"
  2. "dog"
  3. "car"
  4. "apple"
  5. "banana"

现在,我们需要根据用户的输入进行匹配。例如,用户输入了 "carr",我们需要找到与之最相似的关键词。我们可以使用 Levenshtein 距离算法来计算用户输入和数据库中每个关键词的距离,然后选择距离最小的关键词作为匹配结果。

下面是一个使用 Levenshtein 距离算法进行关键词匹配的示例代码:

import java.util.ArrayList;
import java.util.List;

public class KeywordMatcher {

    private List<String> keywords;

    public KeywordMatcher(List<String> keywords) {
        this.keywords = keywords;
    }

    public String match(String input) {
        int minDistance = Integer.MAX_VALUE;
        String match = "";

        for (String keyword : keywords) {
            int distance = LevenshteinDistance.calculate(input, keyword);
            if (distance < minDistance) {
                minDistance = distance;
                match = keyword;
            }
        }

        return match;
    }

    public static void main(String[] args) {
        List<String> keywords = new ArrayList<>();
        keywords.add("cat");
        keywords.add("dog");
        keywords.add("car");
        keywords.add("apple");
        keywords.add("banana");

        KeywordMatcher matcher = new KeywordMatcher(keywords);

        String input = "carr";
        String result = matcher.match(input);

        System.out.println("The most similar keyword to \"" + input + "\" is: " + result);
    }