#include<iostream>
#define MAXSIZE 255
typedef struct
{
char ch[MAXSIZE];
int length;
}SString;
bool SubString(SString &Sub,SString S,int pos,int len)
{
if(pos+len-1>S.length)return false;
for(int i=pos;i<pos+len;i++)
{
Sub.ch[i-pos+1]=S.ch[i];
}
Sub.length=len;
return true;
}
int StrCompare(SString S,SString T)
{
for(int i=1;i<S.length&&i<T.length;i++)
{
if(S.ch[i]!=T.ch[i])return S.ch[i]-T.ch[i];
}
return S.length-T.length;
}
int Index1(SString S,SString T)
{
int i=1,n=S.length,m=T.length;
SString Sub;
while(i<=n-m+1)
{
SubString(Sub,S,i,m);
if(StrCompare(Sub,T)!=0)i++;
else
{
return i;
}
}
return 0;
}
int Index2(SString S,SString T)
{
int k=1;
int i=k,j=1;
while (i<=S.length-T.length+1&&j<=T.length)
{
if(S.ch[i]==T.ch[i])
{
i++;
j++;
}
else
{
k++;
i=k;
j=1;
}
}
if(j>T.length)return k;
else return 0;
}
void get_next(SString T,int next[])
{
int i=1,j=0;
next[1]=0;
while(i<T.length)
{
if(j==0||T.ch[i]==T.ch[j])
{
i++;
j++;
next[i]=j;
}
else
{
j=next[j];
}
}
}
void get_nextval(SString T,int nextval[])
{
int i=1,j=0;
nextval[1]=0;
while (i<T.length)
{
if(j==0||T.ch[j]==T.ch[i])
{
i++;
j++;
if(T.ch[i]!=T.ch[j])nextval[i]=j;
else nextval[i]=nextval[j];
}
else j=nextval[j];
}
}
int index_KMP(SString S,SString T)
{
int i=1,j=1;
int next[T.length+1];
get_next(T,next);
while (i<=S.length&&j<=T.length)
{
if(j==0||S.ch[i]==T.ch[j])
{
i++;
j++;
}
else
{
j=next[j];
}
}
if(j>T.length)return i-T.length;
else return 0;
}
转载请注明原文地址:https://ipadbbs.8miu.com/read-27207.html