目录
一、串的表示和实现
1.定长顺序存储表示
2.堆分配存储表示
typedef struct{
char *ch;//若是非空串,则按串长分配存储区;否则ch为NULL
int length;
}HString;
3.串的块链存储表示
#define CHUNKSIZE 80
typedef struct Chunk{
char ch[CHUNKSIZE];
struct Chunk *next;
}Chunk;
typedef struct{
Chunk*head,*tail;
int curlen;
}LString;
二、串的模式匹配算法
1.模式匹配简单算法
int Index(SString S,SString T,int pos){
int i=pos,j=1;
while(i<=S[0]&&j<=T[0]){
if(S[i]==T[j]){
i++;
j++;
}else{
i=i-j+2;//i-j是回到此次比较的第一个元素前一个(i,j都是数组下标所以会多减一个)
//再加2是往后挪一位开始比较:加1的话是原来的开始位置,所以要往后再加1也就是加2
j=1;
}
}
if(j>T[0]) return i-T[0];
else return 0;
(1)时间复杂度分析(好的情况)
(2)时间复杂度分析2(坏的情况)
2.模式匹配KMP算法
根据next数组去判断模式串的哪一位与主串当前位进行比较
(1)KMP算法
int Index_KMP(SString S,SString T,int pos){
i=pos;
j=1;
while(i<=S[0]&&j<=T[0]){
if(j==0||S[i]==T[j]){//j可能等于0是因为上一次如果是j等于1的话,就会进else语句被赋成0
i++;
j++;
}
else j=next[j];
}
if(j>T[0]) return i-S[0];
else return 0;
}
(2)求next函数值
除了模式串1号位的next值为0,其他的位对应的next值都是最长前(后)缀子串的长度加一
void get_next(SString T,int next[]){//next传引用过来的
int m=1,n=0'
next[1]=0;
while(m<T[0]){
if(n==0||T[m]==T[n]) next[++m]=++n;//n是上一次模式串第n位的next值,如果第m位和第n位相
//等就相当于是第m-1位的最长前后缀串的往后再加一位还
//是相等的,所以当前位的next值是上一位的next值也就
//是n再加一
else n=next[n];//迭代,如果新增一位不等,就往前找新的相等的子串
}
}