#kmp
第一次发blog嘿嘿嘿肯定得弄点不一样的
学kmp…发现看不懂别人的code 这就很尴尬
那怎么办呢
我自己写一个不就好了哈哈哈哈哈哈
void getnt()
{
int i = 1, j = 0;
nt[0] = 0;
while(i < m)
{
if(arr2[i]==arr2[j])
{
nt[i++]=j+1;
j++;
continue;
}
if(j==0)
{
nt[i++]=0;
continue;
}
if(arr2[i]!=arr2[j])
{
j=nt[j-1];
}
}
}
//关于getnext
//在求前缀和后缀的时候,为什么是j = nt[j-1];
//因为判断的是最大前后缀匹配
//例如
// a b a d a b a a
//nt 0 0 1 0 1 2 3 1
//在匹配到d 和 最后一个a时,d != a 但是i-1 肯定和j-1是相同的,这个时候看j-1的next值知道是不是和前面是匹配上的上面那个栗子就是下标2和下标0是匹配的,既然是求最大前后匹配,这样就是让最后一个a与下标1的b比较,如果一样最后一个a的next就是2,因为前一个a已经是匹配上的了
int kmp()
{
getnt();
for(int i=0;i<9;++i) printf("%d ",nt[i]);
int i = 0, j = 0;
while(i < n)
{
if(arr1[i]==arr2[j])
{
i++;
j++;
}
else
{
if(j==0) i++;
else j=nt[j-1];
}
if(j == m)
return i - m +1;
}
return -1;
}
嘿嘿 自己的模板 嘿嘿嘿