21xrx.com
2024-11-22 02:59:08 Friday
登录
文章检索 我的文章 写文章
KMP算法Java实现
2023-09-17 15:02:46 深夜i     --     --
KMP算法 Java 实现

KMP算法是一种高效的字符串匹配算法,它的实现可以大大提高字符串匹配的效率。本文将介绍KMP算法的Java实现。

KMP算法是由Knuth-Morris-Pratt三位科学家于1977年提出的,它的核心思想是利用已经匹配过的部分信息来避免不必要的比较。

在KMP算法中,我们需要构建一个部分匹配表,这个表记录了每一个前缀串(除去第一个字符)中最长的相等前缀和后缀的长度。根据这个表,我们可以在匹配过程中遇到不匹配的字符时,直接跳过已经匹配的部分,从而提高匹配效率。

下面是KMP算法的Java实现代码:


public class KMP {

  public static int kmp(String text, String pattern) {

    int[] lps = computeLPSArray(pattern);

    int n = text.length();

    int m = pattern.length();

    int i = 0; // text中的指针

    int j = 0; // pattern中的指针

    while (i < n) {

      if (text.charAt(i) == pattern.charAt(j)) {

        i++;

        j++;

      }

      if (j == m)

        return i - j;

       else if (i < n && text.charAt(i) != pattern.charAt(j)) {

        if (j != 0)

          j = lps[j - 1];

        else

          i++;

      }

    }

    return -1;

  }

  private static int[] computeLPSArray(String pattern) {

    int m = pattern.length();

    int[] lps = new int[m];

    int len = 0;

    int i = 1;

    while (i < m) {

      if (pattern.charAt(i) == pattern.charAt(len)) {

        len++;

        lps[i] = len;

        i++;

      } else {

        if (len != 0) {

          len = lps[len - 1];

        } else {

          lps[i] = len;

          i++;

        }

      }

    }

    return lps;

  }

  public static void main(String[] args) {

    String text = "ABABDABACDABABCABAB";

    String pattern = "ABABCABAB";

    int index = kmp(text, pattern);

    if (index != -1) {

      System.out.println("Pattern found at index " + index);

    } else {

      System.out.println("Pattern not found");

    }

  }

}

在上面的代码中,kmp(String text, String pattern)方法接受两个参数,分别是待匹配的文本字符串和要搜索的模式字符串。该方法中,我们首先调用了computeLPSArray(String pattern)方法来构建部分匹配表。然后使用两个指针i和j分别指向text和pattern的起始位置,然后进行匹配过程。

在匹配过程中,如果text[i]和pattern[j]相等,我们就将两个指针都向后移动一位。如果j等于模式字符串的长度m,则表示找到了一个完整的匹配,返回起始位置的索引。如果text[i]和pattern[j]不相等,我们会移动模式指针j到lps[j-1]的位置,这个位置记录了最长相等前缀和后缀的长度,这样可以避免重复比较已经匹配过的部分。

在上述代码中,我们通过调用kmp方法来在文本字符串中搜索模式字符串,如果找到了匹配的子串,就会返回其起始位置的索引,否则返回-1。我们通过main方法来测试这个算法,在给定的文本字符串中搜索模式字符串,并打印出结果。

总之,KMP算法是一种高效的字符串匹配算法,其内部实现通过构建部分匹配表来提高匹配效率。通过使用KMP算法,我们可以更加高效地在字符串中搜索目标模式。通过这篇文章,我们了解了KMP算法的Java实现,并通过一个简单的示例进行了演示。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复