5.2 串的定義算法
5.3 串的比較 strcmp();數組
5.6 樸素的模式匹配算法 //KMP模式匹配算法spa
int Index(String S , Sring T , int pos)get
{next
int i=pos;while
int j=0;字符
//int next[255];return
//get_next(T,next);//KMP算法獲得next數組;void
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回溯;
}
}