初探—KMP模式匹配算法

时间:2024-06-28 20:05:02

KMP算法思想:

普通的字符串匹配算法S主串必须要回溯。但回溯就影响了效率。

改进的地方也就是这里,我们从P 串本身出发,事先就找准了T自身前后部分匹配的位置,那就可以改进算法。

next数组的含义:

   T串各个位置的j值的变化定义为一个数组next

   “当匹配到S[i] != P[j]的时候有 S[i-j…i-1] = P[0…j-1]. 如果下面用k 去匹配,则有P[0…k-1] = S[i-k…i-1] = P[j-k…j-1]。得到 P[0…k-1] = P[j-k…j-1];

   next[j]=Max{ "p1...pk-1"="Pj-k+1...Pj-1"}

 void CkmpDlg::get_next(String T, int* next) //根据String T子串,求next[] 数组
{
int i,j;
i=;
j=;
next[]=;
while(i<T[])
{
if(j== || T[i]== T[j])//T[i]表示后缀单个字符,T[j]表示前缀的单个字符,如何相同,各自后移。
{
++i;
++j;
if(T[i]!=T[j])
next[i]=j;
else
next[i]=next[j];
}
else
j=next[j];
} }

get_next() 的求解:T 既是主串,又是模式串。未完待续....