这周主要学习了KMP算法
简单来说呢,我觉得kmp算法就是两个部分,1是求next数组,2是用next数组
先说求next数组
首先next【i】数组代表的的意思是当第i位失配时,我的匹配串能跳转的最优位置,什么是最优位置呢,这就取决于第i位之前的字符串自身了
如果它存在这样的关系,这个图说明了很多,对后面next数组求得循环节问题也很有帮助
那么next【i】就应该指向P【k】所在得下标处
接下来就是算法实现了(注意得就是如果第一位就没能匹配成功,那就得特判一下,即都同时往后移动一位)
void getnext(int len)//只需要获得字符串的长度
{
int i = 0,j = -1;//确定两个指向,寻找匹配串的next
nex_t[0] = -1;
while(i < len)
{
if(j == -1 || b[i] == b[j])//j = -1就是说已经指到头了还没有匹配,所以直接前跳就好了,没有发现匹配项
{
nex_t[++i] = ++j;
}
else
{
j = nex_t[j];
}
}
}
接下来就是使用next数组进行匹配了,这个相应得就好理解了,无非就是跳不跳,跳到哪得问题了int kmp(int len1,int len2)
{
int i = 0,j = 0;//匹配项和被匹配项都得从零开始
while(i < len1 && j < len2)
{
if(j == -1 || a[i] == b[j])//j = -1表示第一个不匹配直接后移一位
//因为跳跃只能控制j无法控制i所以用这个特判一下i可以往下跳动了
{
i++;j++;
}
else
{
j = nex_t[j];
}
}
if(j == len2)
{
return i - j + 1;
}
else
{
return -1;
}
}
最后得return是返回得出现的位置,i - j + 1为匹配成功时母串得位置所在~~