5.2 串的定义
5.3 串的比较 strcmp();
5.6 朴素的模式匹配算法 //KMP模式匹配算法
int Index(String S , Sring T , int pos)
{
int i=pos;
int j=0;
//int next[255];
//get_next(T,next);//KMP算法得到next数组;
while(i<S.size()&&j<=T.size())
{
if(S[i]==T[j]) // || j==0;
{
++i;
++j;
}
else
{
i=i-j+1; //i退回到上次匹配的首位的下一位;
j=0; //子串退回到T的首位;
//j=next[j]; //j退回合适的位置,i不变; KMP算法;
}
}
if(j>T.size())
{
return i-T.size();
}
else
return 0;
}
next数组的推演;
void get_next(Sting T,int *next)
{
int i,j;
i=1;
j=0;
next[1]=0;
while(i<T.size())
{
if(j==0 || T[i]==T[j])
{
++i;
++j;
next[i]=j;
}
else
j=next[j]; // j回溯;
}
}
KMP算法的改进:
void get_nextval (Sting T,int *next)
{
int i,j;
i=1;
j=0;
nextval[1]=0;
while(i<T.size())
{
if(j==0 || T[i]==T[j])
{
++i;
++j;
//next[i]=j;
if(T[i]!=T[j]) //若当前字符与前缀字符不同,则当前的j为nextval在i位置的值;
{
nextval[i]=j;
}
else
nextval[i]=nextval[j];//如果与前缀字符相同则将前缀字符的nextval值赋值给nextval在i位置的值;
}
else
j=nextval[j]; // j回溯;
}
}