码迷,mamicode.com
首页 > 其他好文 > 详细

KMP算法

时间:2014-08-29 17:59:38      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   ar   2014   log   sp   amp   line   

KMP算法是一种改进的字符串匹配算法。适用于模式串P有循环重复段的情况下。

原理:

主串 S:S1, S2, …, …, …, …, …, …, Si-k+1, …, Si-1, Si

模式串P:(P1, P2, …, Pk-1,) Pk, …, (Pj-k+1, …, Pj-1,) Pj

Pj与Si不匹配,表示(Pj-k+1, …, Pj-1,) 与S匹配,而(Pj-k+1, …, Pj-1,) 与(P1, P2, …, Pk-1,)相同,所以(P1, P2, …, Pk-1,)与S也匹配,直接将模式串右移,将Pk与Si进行匹配,即j的next值为k。

实现:

public int index_KMP(char[] S, char[] P) {

int len = P.length;

int[] next = new int[len + 1];

get_next(P, next);

int i = 0, j = 0;

while (i < S.length && j < P.length) {

  if (S[i] == P[j]) {

    i++;

    j++;

  } else {

     j = next[j + 1] - 1;

  }

}

if (j == P.length)

    return i - P.length + 1;

return 0;

}

next函数:

next[1] = 0;

设next[j] = k

if (Pk == Pj) next[j+1] = (k + 1 =) next[j] + 1;

else if (Pj == P(next[k]) next[j+1] = next[k] + 1;

else …

if (j == 0) next[j] = -1;

描述:

j = 1时,next值为0;

j+1时,查看前一位j的值Pj与next[j]的值是否相同,若相同,从next[j]的下一位开始比较,若不相同,再查看Pj与next[j]的next[j]是否相同,一直到j==0,next[j]=-1。

private void get_next(char[] P, int[] next) {

next[1] = 0;

int i = 1;

int j = 0;

while (i < P.length) {

    if (j == 0 || P[i - 1] == P[j - 1]) {

        i++;

        j++;

        next[i] = j;

    } else {

        j = next[j];

    }

}

}

next函数举例:

bubuko.com,布布扣

KMP算法

标签:style   blog   http   ar   2014   log   sp   amp   line   

原文地址:http://www.cnblogs.com/wenxinxiaochan/p/3945154.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!