空串:啥都没有(所有空串相等)
空格串:若干空格组成的串
真子串:不包含自己的所有子串
串相等:长度相等,且各个对应位置上的字符都相同
串可以采用和线性表相同的存储结构
顺序存储(用的多)
#define MAXLEN 255
typedef struct{
char ch[MAXLEN +1]; //[0]——[255],对于有些算法这样会简单一点
int length; //串的当前长度
}SString;
块链(一个结点中放多个字符,以提高存储密度)
#define CHUNKSIZE 80;
typedef struct Chunk{ // 块
char ch[CHUNKSIZE];
STRUCT CHUNK *NEXT;
}
typedef struct{
Chunk *head,*tail;
int curlen;
}LString;
不理解就背下来先
*****模式匹配*****
BF算法
S:aaaaab 长度m i=1
T:aaab 长度n j=1
挨个比较,匹配成功,i++ j++ 匹配下一个 j>=n匹配成功
匹配失败:i = i-j+2(回溯)
j = 1
int index_BF(SString S,SString T){
int i =1 ,j = i;
while(i <= S.length && j<=T.length){
if(s.ch[i]==t.ch[j]) {++i;++j;}
else{i = i-j+2;j = 1;}
}
if(i>=T.length) return i-T.length;
else return 0;
}
时间复杂度O(m*n)
KMP算法 时间复杂度O(m+n)
j = a b c a a b b c a b c a a b d a b
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
next[j] = 0 1 //(1)当j=1时,next[j]=0 (通常前两个就是 0 1)
1 1 //(2) 其他情况
2 //(3)前面有k-1 = 1个字符一样,next[j]=k=2
2 //同上一个
3//k-1 = 2, next[j] = 3
1 1 2 3 4 5 6 7 1 1
int Index_KMP(SString S, SString S, int pos){
i = pos, j =1;
while(i < S.length && j < T.length){
if(j == 0 || S.ch[i] == T.ch[i]) {i++; j++;}
else{ j = next[j];} //与BF算法相比,*i不变,j按照next后退
}
if(j > T.length) return i-T.length; //匹配成功
else return 0; //返回不匹配标志
}
求next数组
void get_next(SString T, int &next[]){
i = 1;next[1] = 0;j = 0;
while(i<T.length){
if(i == 0 || T.ch[i] == T.ch[j]){
++i,++j;
next[i] = j;
}else j = next[j];
}
}
改进 :nextval
s: a a a b a a a a b
p: a a a a b
i = 4 不动
j按照next[j]回溯,j = 3 不一样,j = 2不一样, j = 1不一样,则i + 1