第四章 串
填空、选择、next函数
知识点
- 了解串的存储方法
顺序存储
```c
typedef struct{
char *ch;
int length;
}HString
```
链式存储
```c
#define CHUNKSIZE 80 //可由用户定义的块大小
typedef struct Chunk{
char ch[CHUNKSIZE];
struct Chunk *next;
}Chunk;
typedef struct{
Chunk *head,*tail;
int length;
}LString;
```
- 理解串的两种模式匹配算法
算法目的
- 确定主串中所含子串第一次出现的位置(定位)
即如何实现教材P72 Index(S,T,pos)函数
算法种类
BF算法(Brute-Force,又称古典的、经典的、朴素的、穷举的)
-
将主串的第pos个字符和模式的第一个字符比较,
-
若相等,继续逐个比较后续字符;
-
若不等,从主串的下一字符起,重新与模式的第一个字符比较。
-
-
直到主串的一个连续子串字符序列与模式相等。返回值为S中与T匹配的子序列第一个字符的序号,即匹配成功。
-
否则,匹配失败,返回值 0
int Index(String S,String T,int pos){
int i = pos;
int j = 0;
while(i <= S[0] && j <= T[0]){
if(S[i] == T[j]){
i++;
j++;
}
else{
i = i - j + 2;
j = 1;
}
}
if(j > T[0]){
return i-T[0];
}
else{
return 0;
}
}
时间复杂度
若n为主串长度,m为子串长度,最坏情况是
总次数为:(n-m)*m+m=(n-m+1)*m
若m<<n,则算法复杂度O(n*m)
KMP算法(特点:速度快)
- 串的基本操作
(1) StrAssign (&T,chars) //串赋值
将char的串值赋值给T,T原来的值被覆盖掉。
(2) StrCompare (S,T) //串比较
若S == T,操作返回值为0;
若S <