模式匹配.


kmp算法:书中给出的定义:

一.  新建匹配字符串(非匹配的目标文本)的长度的next数组的算法:

(1)next[0]= -1 意义:任何串的第一个字符的模式值规定为-1。

(2)next[j]= -1 意义:模式串T中下标为j的字符,如果与首字符相同,且j的前面的1—k个字符与开头的1—k个字符不等(或者相等但T[k]==T[j])(1≤k<j)。
        如:T=”abCabCad” 则 next[6]=-1,因T[3]=T[6]
(3)next[j]=k 意义:模式串T中下标为j的字符,如果j的前面k个字符与开头的k个字符相等,且T[j] != T[k] (1≤k<j)。
 即T[0]T[1]T[2]。。。T[k-1]==T[j-k]T[j-k+1]T[j-k+2]…T[j-1]且T[j] != T[k].(1≤k<j);
 (4) next[j]=0 意义:除(1)(2)(3)的其他情况。

代码实现:

public void KMPSetNext(char[]a,int next[]){

if(a!=null && next!=null && a.length>0 && next.length>0&&a.length == next.length){
next[0] = -1;
int i = 0;
int k = -1;
while(i<a.length-1){
if(k==-1||a[i] == a[k]){
i++;
k++;
if(a[i]!=a[k])
next[i] = k;
else{
next[i] = next[k];
}
}else{
k= next[k];
}
}
}
}

找自己前面n个和前n个字符相同,且自己不等于n+1个,就是n,否则 自己不等于第一个,模就是0,否则-1.


二.用next数组来匹配文本: 

实现原理: 如果文本和匹配字符串相等,文本和字符串继续+1比较,否则 如果next数组不是-1模式串右移,next数组是-1文本右移1,模式匹配串重新开始.

代码:

if(Text[i]== Pattern[j])
{
++i;// 继续比较后继字符
++j;
}
else
{
if(next[j]!=-1)
j=next[j];// 模式串向右移动
else
{
j=0;
++i;
}
}

自己总结: 

原文地址:https://www.cnblogs.com/thinkqin/p/3780936.html