📅  最后修改于: 2023-12-03 14:53:37.007000             🧑  作者: Mango
本文将介绍如何使用Java编写在线字符串匹配的Wagner和Fisher算法。该算法用于在文本中查找模式,并返回模式的起始位置。下面我们将解释算法的原理,并提供一个示例Java程序。
Wagner和Fisher算法是一种动态规划算法,用于在字符串中查找模式。 它的原理是,将模式与每个字符串的所有可能子串一一匹配,并在每个子问题上使用递归方法以计算最小编辑距离。 最后,返回具有最小编辑距离的子串的起始位置。
Wagner和Fisher算法包括两个矩阵:距离矩阵和路径矩阵。
Wagner和Fisher算法可以使用两个简单的二次循环嵌套来有效地实现。
以下是使用Java编写的Wagner和Fisher算法的示例代码。此代码的输入是模式和文本,输出是模式在文本中的起始位置。
public class WagnerFisher {
public static int search(String pattern, String text) {
int pLen = pattern.length();
int tLen = text.length();
int[][] dist = new int[pLen + 1][tLen + 1];
int i, j, cost;
for (i = 0; i <= pLen; i++) {
dist[i][0] = i;
}
for (j = 0; j <= tLen; j++) {
dist[0][j] = j;
}
for (i = 1; i <= pLen; i++) {
for (j = 1; j <= tLen; j++) {
cost = pattern.charAt(i - 1) == text.charAt(j - 1) ? 0 : 1;
dist[i][j] = Math.min(dist[i - 1][j] + 1, Math.min(dist[i][j - 1] + 1, dist[i - 1][j - 1] + cost));
}
}
return findStartPosition(dist, pLen, tLen);
}
private static int findStartPosition(int[][] dist, int pLen, int tLen) {
int i, j;
for (i = 1; i <= pLen; i++) {
for (j = 1; j <= tLen; j++) {
if (dist[i][j] == 0) {
return j - pLen;
}
}
}
return -1;
}
}
要使用Wagner和Fisher算法,请将示例代码复制到您的Java项目中。 然后,您可以使用以下代码行在您的应用程序中调用该算法:
int startIndex = WagnerFisher.search("pattern", "text");
其中,'pattern'是要搜索的模式,'text'是要在其中搜索模式的文本字符串。'startIndex'是返回的值,它是模式在文本中的起始位置。
现在,您已经学会了在Java中使用Wagner和Fisher算法进行在线字符串匹配。 请在您的项目中尝试运行此算法,并在需要的场景中使用它。