实现用于在线字符串匹配的 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)。