一.串的基本定义:
- 串的顺序存储:
//静态数组实现(定长顺序存储)
#define MaxSize 408 //预定义最大串长
typedef struct{
char ch[MaxSize]; //静态数组实现
int length; //串的实际长度
}SString;
//动态数组实现(堆分配存储)
typedef struct{
char *ch; //按串长分配存储区,ch指向串的基地址
int length; //串的长度
}HString;
HString S;
S.ch=(char*)malloc(MaxSize*sizeof(char)); //最后需要手动free
S.length=0;
- 串的链式存储:
typedef struct StringNode{
char ch[4]; //每个结点存多个字符
struct StringNode *next;
}StringNode,*String;
二.串的基本操作:
- 求子串:(SubString)
//用sub返回串S的第pos个字符起长度为len的子串
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;
}
- 串的比较:(StrCompare)
最简单的操作。
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]; //S>T则返回>0,S=T返回=0,S<T返回<0
}
//扫描所有的字符都相同,长度长的串更大
return S.length-T.length;
}
- 定位操作:(Index)
若主串S中存在与串T相同的子串,则返回他在主串S中第一次出现的位置,否则返回0。
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;
}
5.简单模式匹配:(朴素模式匹配)
若主串S中存在与串T相同的子串,则返回他在主串S中第一次出现的位置,否则返回0。
int Index(SString S,SString T){
int k=1,i=k,j=1; //从第一个字符开始匹配,第零个位置为空。k为主串起始匹配位置
while(i<=S.length&&j<=T.length){
if(S.ch[i]==T.ch[i]){
i++;
j++;
}else{
k++; //检查下一个子串
i=k;
j=1; //j重新回到模式串起始位置
}
if(j>T.length) //若全部匹配成功,j依然会+1导致j大于模式串长
return k;
else
return 0;
}
模式匹配应用很广,搜词条的时候就是在模式匹配。一般模式串(关键词)很短,远远小于主串长度。