串的顺序存储结构
#define MAXLEN 255
typedef struct{
char ch[MAXLEN+1]; //存储串的一维数据
int length; //串的当前长度
}SString;
串的链式存储结构——块链结构
#define CHUNKSIZE 80 //块的大小可由用户定义
typedef struct Chunk{
char ch[CHUNKSIZE];
struct Chunk *next;
}Chunk;
typedef struct{
Chunk *head,*tail; //串的头指针和尾指针
int curlen; //串的当前长度
}LString; //字符串的块链结构
串的模式匹配算法
算法目的:确定主串中子串第一次出现的位置,
应用:搜索引擎、拼写检查、语言翻译、数据压缩
算法种类:
BF算法(简单匹配法)
KMP算法(速度快)
int Index_BF(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; //模式匹配不成功
}
BF算法时间复杂度 (n-m+1)*m
其中,n为主串长度,m为子串长度
KMP算法
int Index_KMP(SString S,SString T,int pos){
i=pos,j=1;
while(i<S.length&&j<T.length){
if(j==0||S.ch[i]==T.ch[j]){i++;j++}
else
j=next[j]; //i不变,j后退
}
if(j>T.length) return i-T.length; //匹配成功
else return 0; //返回不匹配标志
}
void get_next(SString T,int &next[]){
i=1;next[1]=0;j=0;
while(i<T.length){
if(j==0||T.ch[i]==T.ch[j]){
++i;++j;
next[i]=j;
}
else
j=next[j];
}
}
主串i不必回溯。可提速到O(m+n)。