📜  用于模式搜索的 KMP 算法的Java程序(1)

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

用于模式搜索的 KMP 算法的 Java 程序

介绍

KMP(Knuth-Morris-Pratt)算法是一种字符串匹配算法,可以在多个字符串中搜索特定的模式。该算法不需要对被搜索的字符串进行排序,且时间复杂度为 $O(n+m)$,其中 $n$ 是被搜索的字符串的长度,$m$ 是要搜索的模式的长度。

KMP 算法通过预处理模式字符串,然后在搜索过程中利用这些信息,将模式字符串向右移动,从而避免了在搜索过程中对每个字符进行比较的操作。这使得该算法比朴素的字符串匹配算法更加高效。

该程序实现了 KMP 算法,使用 Java 语言编写。它接受两个字符串作为输入,第一个字符串是被搜索的字符串,第二个字符串是要搜索的模式。该程序输出要搜索的模式在被搜索的字符串中第一次出现的位置。

算法实现
public class KMP {

    private int[] preprocessPattern(String pattern) {
        int[] fail = new int[pattern.length()];
        fail[0] = 0;
        int i = 1, j = 0;
        while (i < pattern.length()) {
            if (pattern.charAt(i) == pattern.charAt(j)) {
                fail[i] = j + 1;
                i++;
                j++;
            } else if (j > 0) {
                j = fail[j - 1];
            } else {
                fail[i] = 0;
                i++;
            }
        }
        return fail;
    }

    public int search(String text, String pattern) {
        int[] fail = preprocessPattern(pattern);
        int i = 0, j = 0;
        while (i < text.length()) {
            if (text.charAt(i) == pattern.charAt(j)) {
                if (j == pattern.length() - 1) {
                    return i - pattern.length() + 1;
                } else {
                    i++;
                    j++;
                }
            } else if (j > 0) {
                j = fail[j - 1];
            } else {
                i++;
            }
        }
        return -1;
    }
}

该程序中的 KMP 类实现了 KMP 算法。其中,preprocessPattern 方法对要搜索的模式字符串进行预处理,生成一个辅助数组 fail。该数组的每个元素表示当前位置以前的最长前缀和最长后缀的重合部分的长度。在搜索过程中,如果遇到不匹配的情况,就根据 fail 数组将模式字符串向右移动一定的位置。这样,就可以减少比较的次数,提高搜索效率。

使用方法

要使用这个程序进行模式搜索,请按照以下步骤操作:

  1. 新建一个 Java 项目,将上述代码复制到一个 Java 类中。
  2. 在自己的代码中,创建 KMP 类的实例。
  3. 调用 KMP 类的 search 方法,传入要搜索的字符串和模式字符串作为参数。

以下是一个使用示例:

public class Main {

    public static void main(String[] args) {
        String text = "ABABABCABAABABAB";
        String pattern = "ABAB";
        KMP kmp = new KMP();
        int index = kmp.search(text, pattern);
        if (index != -1) {
            System.out.println("Pattern found at index " + index);
        } else {
            System.out.println("Pattern not found");
        }
    }
}

该程序将在 text 中搜索 pattern,输出 patterntext 中第一次出现的位置。在本例中,输出的结果为:

Pattern found at index 0
总结

KMP 算法是一种高效的字符串匹配算法,它通过预处理模式字符串,利用这些信息在搜索过程中将模式字符串向右移动,从而避免了对每个字符进行比较的操作。该算法的时间复杂度为 $O(n+m)$,其中 $n$ 是被搜索的字符串的长度,$m$ 是要搜索的模式的长度。该程序实现了 KMP 算法,使用 Java 语言编写,可以在多个字符串中搜索特定的模式。