字符串操作是面试中经常让被面试者在纸上写的程序,串的匹配更是很多问题的抽象,解决这个问题很适当的方法就是KMP算法,该算法出现在大多数数据结构的教材上,可见其基础性与重要性。本文列举其代码,进行简单阐述。
笔者认为该算法的特点是:主要思想相对于其具体实现更加通俗。其主要思想就是匹配阶段,如何避免主串的指针回移,方法就是根据匹配串的重复特点,选择匹配串上的特定字符与当前主串指针指向的字符进行比较。
其实现阶段涉及到哨兵元素next[0]=-1,使代码变得更加简洁,但是更不好理解。笔者建议理解next的含义可以从调用其的用途出发。即,which is the next one to compare
#define PL 200
#define SL 200
int next[PL];
char S[SL];
char P[PL];
void get_next()
{
int i=0; //前指针
int j=1; //后指针
next[0]=-1; //P[0]之前没有元素 也可理解为哨兵
next[1]=0; //
while(j<PL)
{
if(i==-1||P[i]==P[j])
{
i++;
j++;
next[j]=i;
}
else
{
i=next[i];
}
}
}
int KMP() { int i=0; int j=0; get_next(); while(i<SL&&j<PL) { if(j==-1||S[i]==P[j]) //j==-1 哨兵 { i++; j++; } else { j=next[j]; //S[i]与P[j]比较不相等之后,比较S[i]与P[next[j]],所以P[j]!=P[next[j]],且P[j-1]==P[next[j]-1] } } if(PL-1==j) { return i-PL; //start position } else return -1; }