Knuth Morris Pratt string-searching algorithm - Java Algorithm

Java examples for Algorithm:String

Description

Knuth Morris Pratt string-searching algorithm

Demo Code


import java.io.BufferedReader;

import java.io.InputStreamReader;
import java.io.IOException;

public class KMPalgorithim {
  /** Failure array **/
  private int[] failure;

  public KMPalgorithim(String text, String pat) {
    /** pre construct failure array for a pattern **/
    failure = new int[pat.length()];
    fail(pat);/*from w  w w  .  j av  a2  s .  c  o m*/
    /** find match **/
    int pos = posMatch(text, pat);
    if (pos == -1)
      System.out.println("\nNo match found");
    else
      System.out.println("\nMatch found at index " + pos);
  }

  /** Failure function for a pattern **/
  private void fail(String pat) {
    int n = pat.length();
    failure[0] = -1;
    for (int j = 1; j < n; j++) {
      int i = failure[j - 1];
      while ((pat.charAt(j) != pat.charAt(i + 1)) && i >= 0)
        i = failure[i];
      if (pat.charAt(j) == pat.charAt(i + 1))
        failure[j] = i + 1;
      else
        failure[j] = -1;
    }
  }

  /** Function to find match for a pattern **/
  private int posMatch(String text, String pat) {
    int i = 0, j = 0;
    int lens = text.length();
    int lenp = pat.length();
    while (i < lens && j < lenp) {
      if (text.charAt(i) == pat.charAt(j)) {
        i++;
        j++;
      } else if (j == 0)
        i++;
      else
        j = failure[j - 1] + 1;
    }
    return ((j == lenp) ? (i - lenp) : -1);
  }

  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("\nEnter Text\n");
    String text = br.readLine();
    System.out.println("\nEnter Pattern\n");
    String pattern = br.readLine();
    KMPalgorithim kmp = new KMPalgorithim(text, pattern);
  }
}

Related Tutorials