📜  实现用于在线字符串匹配的 Wagner 和 Fisher 算法的Java程序

📅  最后修改于: 2022-05-13 01:54:52.401000             🧑  作者: Mango

实现用于在线字符串匹配的 Wagner 和 Fisher 算法的Java程序

Wagner-Fischer 算法是一种动态规划算法,用于测量两个字符串之间的Levenshtein 距离或编辑距离。 Levenshtein Distance(LD) 计算两个字符串的相似程度。距离由三个参数计算,将string1转换为string2。

参数是:

  • 删除次数
  • 插入次数
  • 换人次数

例如

Input:  str1="cat"  str2="cat"
 Output: 0
 
 The levenshtein distance i.e. LD(str1,str2)=0, because both the strings 
 are equal and no changes are needed.
 
 
 Input:  str1="bat"   str2="cat"
 Output: 1
 
 The levenshtein distance i.e. LD(str1,str2)=1, because we need to 
 substitute 'b' with 'c' to transform the string1 to string2.
 
 
 Input:  str1="bat"   str2="ball"
 Output: 2
 
 The levenshtein distance i.e. LD(str1,str2)=2, because there is 
 one substitution of 't' to 'l' and one insertion of 'l' needed to
 transform "bat" to "ball".

算法 :

  • 将字符串str1 和 str2 的长度分别存储在一些变量中,例如 n 和 m。
  • 如果 n==0 返回 m
  • 如果 m==0 返回 n
  • 构造一个 m 行 n 列的矩阵,并将第一行初始化为 0 到 n,将第一列初始化为 0 到 m。
  • 检查 str1 的每个字符和 str2 的每个字符。
  • 如果 str1[i] 处的字符等于 str2[j] 处的字符,则 m 为 0,如果两者不相等,则 m 为 1。
  • 将矩阵 arr[i][j] 处的元素设置为以下项中的最小值:(arr[i-1][j]+1, arr[i][j-1]+1, arr[i- 1][j-1]+m)
  • 在迭代步骤 5、6、7 之后,在 arr[n][m] 处找到距离。

代码 :

Java
// Java Program to Implement Wagner and Fisher
// Algorithm for online String Matching
  
import java.util.*;
  
class GFG {
    public static int getDistance(String str1, String str2)
    {
  
        int l1 = str1.length();
        int l2 = str2.length();
  
        if (l1 == 0)
            return l2;
  
        if (l2 == 0)
            return l1;
  
        int arr[][] = new int[l1 + 1][l2 + 1];
  
        for (int i = 0; i <= l1; i++)
            arr[i][0] = i;
  
        for (int j = 0; j <= l2; j++)
            arr[0][j] = j;
  
        for (int i = 1; i <= l1; i++) {
            char ch1 = str1.charAt(i - 1);
  
            for (int j = 1; j <= l2; j++) {
                char ch2 = str2.charAt(j - 1);
  
                int m = ch1 == ch2 ? 0 : 1;
  
                arr[i][j] = Math.min(
                    Math.min((arr[i - 1][j] + 1),
                             (arr[i][j - 1] + 1)),
                    arr[i - 1][j - 1] + m);
            }
        }
  
        return arr[l1][l2];
    }
  
    public static void main(String[] args)
    {
  
        String str1, str2;
  
        str1 = "bat";
        str2 = "ball";
  
        System.out.println(getDistance(str1, str2));
    }
}


输出
2

时间复杂度: O(m*n)。