偷个懒,对于KMP算法,请在文章搜索关键字“KMP”,选择高赞回答就有详细的题解。
数据结构KMP算法配图详解(超详细)_哈顿之光的博客-CSDN博客_数据结构kmp算法详解
从头到尾彻底理解KMP(2014年8月22日版)_v_JULY_v的博客-CSDN博客_从头到尾彻底理解kmp
本文仅展示OJ题目的部分代码。
next函数的求法,严格意义上属于动态规划算法。如果不画画图很难理解处理过程,这是算法难度大的原因之一。
void get_next(SString T,int next[])
{
int i,j,k,c;
next[0]=0;
next[1]=0;
for(i=2; i<=T[0]; i++)
{
j=i-1;/**< 用循环找到T[next[j]]==T[i-1]的j值,那么next[i]=next[j]+1 */
while(j>0&&T[next[j]]!=T[i-1])
j=next[j];
next[i]=next[j]+1;/**< 如果j==0,那么next[i]=1 */
}
}
kmp算法本身就没什么难度了,按照next函数预处理的结果,失配时调用函数即可。
int Index_KMP(SString S,SString T,int pos)
{
int next[255];
get_next(T,next);
int i=pos,j=1;
while(i<=S[0]&&j<=T[0])
{
if(S[i]==T[j])
i++,j++;
else
{
j=next[j];
if(j==0)/**< j等于0特殊处理下,教材上把这句也放到if里面去了 */
i++,j=1;
}
}
if(j>T[0]) /**< 匹配成功 */
return i-T[0];
return 0;
}