1. 串的顺序存储
#define MAXLEN 255
typedef struct
{
char ch[MAXLEN];
int length;
}SString;
typedef struct
{
char *h;
int length;
}HString;
HString S;
S.ch = (char *)malloc(MAXLEN * sizeof(char));
S.length = 0;
2. 串的链式存储
typedef struct StringNode
{
char ch;
struct StringNode *next;
}StringNode,*String;
typedef struct StringNode
{
char ch[4];
struct StringNode *next;
}StringNode,*String;
3. 串的基本操作
#define MAXLEN 255
typedef struct
{
char ch[MAXLEN];
int length;
}SString;
StrAssign(&T,chars);
StrCopy(&T,S);
StrEmpty(S);
StrLength(S);
ClearString(&S);
DestoryString(&S);
Concat(&T,S1,S2);
SubString(&Sub,S,pos,len);
StrCompare(S,T);
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;
}
Index(S,T);
int Index(SString S,SString T)
{
int i=1,n=StrLength(S),m=StrLength(T);
SString sub;
while(i<=n-m+1)
{
SubString(sub,S,i,m);
if(StrCompare(sub,T)!=0)
++i;
else
return i;
}
return 0;
}
4.串的模式匹配
#define MAXLEN 255
typedef struct
{
char ch[MAXLEN];
int length;
}SString;
int Index(SString S,SString T)
{
int i=1,j=1;
while(i<=S.length && j<=T.length)
{
if(S.ch[i]==T.ch[j])
{
++i;
++j;
}
else
{
i=i-j+2;
j=1;
}
}
if(j>T.length)
return i-T.length;
else
return 0
}
int Index_KMP(SString S,SString T,int next[])
{
int i=1,j=1;
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
}
5. KMP算法
最坏时间复杂度 = O(m+n);其中,求next数组时间复杂度O(m)
模式匹配过程最坏时间复杂度 O(n)
#define MAXLEN 255
typedef struct
{
char ch[MAXLEN];
int length;
}SString;
int Index_KMP(SString S,SString T,int next[])
{
int i=1,j=1;
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
}