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

📅  最后修改于: 2023-12-03 14:53:37.007000             🧑  作者: Mango

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

本文将介绍如何使用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算法进行在线字符串匹配。 请在您的项目中尝试运行此算法,并在需要的场景中使用它。