数据结构学习日记(七)
串(String)---零个或多个任意是符组成的有限序列
子串:事中任意个连续字符组成的子序列称为该串的子串
主串:包含子串的串相应地称为主串
字符位置:字符在序列中的序号为该字符在串中的位置
子串位置:子串第一个字符在主串中的位置
空格串:由一个或多个空格组成的串,与空串不同
串相等:当且仅当两个串的长度相等并且各个对应位置上的字符都相同时,这两个串才是相等的。
串的顺序存储结构:
#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算法:
匹配失败:
i=i-j+2=2(回溯)
j=1(从头开始)
int Index BF(SString S, SStringT){
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 BF(SString S, SStringT,int pos){
int i = pos,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; //模式匹配不成功
}
算法复杂度O(n*m)
KMP算法:
利用已经部分匹配的结果而加快模式串的滑动速度,且主串S的指针i不必回溯,可提速到O(n+m)