KMPMatch.java
上传用户:xfwatch
上传日期:2020-12-14
资源大小:872k
文件大小:1k
源码类别:

中间件编程

开发平台:

Java

  1. package org.jboss.blacktie.jatmibroker.xatmi;
  2. /*
  3.  * The Knuth-Morris-Pratt Algorithm for Pattern Matching
  4.  * http://en.wikibooks.org/wiki/Algorithm_Implementation/String_searching/Knuth-Morris-Pratt_pattern_matcher
  5.  */
  6. public class KMPMatch {
  7.     /**
  8.      * Search the data byte array for the first occurrence
  9.      * of the byte array pattern.
  10.      */
  11.     public static int indexOf(byte[] data, byte[] pattern, int datalen) {
  12.         int[] failure = computeFailure(pattern);
  13.  
  14.         int j = 0;
  15.  
  16.         for (int i = 0; i < datalen; i++) {
  17.             while (j > 0 && pattern[j] != data[i]) {
  18.                 j = failure[j - 1];
  19.             }
  20.             if (pattern[j] == data[i]) {
  21.                 j++;
  22.             }
  23.             if (j == pattern.length) {
  24.                 return i - pattern.length + 1;
  25.             }
  26.         }
  27.         return -1;
  28.     }
  29.  
  30.     /**
  31.      * Computes the failure function using a boot-strapping process,
  32.      * where the pattern is matched against itself.
  33.      */
  34.     private static int[] computeFailure(byte[] pattern) {
  35.         int[] failure = new int[pattern.length];
  36.  
  37.         int j = 0;
  38.         for (int i = 1; i < pattern.length; i++) {
  39.             while (j>0 && pattern[j] != pattern[i]) {
  40.                 j = failure[j - 1];
  41.             }
  42.             if (pattern[j] == pattern[i]) {
  43.                 j++;
  44.             }
  45.             failure[i] = j;
  46.         }
  47.  
  48.         return failure;
  49.     }
  50. }