字符串
字符串及其基本操作
字符串的基本概念
字符串:由零个或多个字符组成的字符序列。记作:s=“s1,s2,s3”。
空串:长度为零叫空串;
空白串:一个或多个空白格组成的串空白串;
子串:串中任意个连续字符组成的子序列称为该串的子串;
主串:包含所有子串的串叫主串;
串变量+串常量:变量 + 常量
串比较与串相等 字符集与编码
字符串的基本操作
? 都没实现 求串长+串赋值+串拼接+求子串+串比较+子串定位+串插入+串删除+串替换 ?
字符串的定长顺序存储及基本操作
串数据元素类型为字符型的线性表(存储结构)。
字符串的定长顺序存储
字符串串尾存储一个不会在串中出现的特殊字符作为串的终结符(\0)。
设置定长串存储空间。用第0号单元存放实际长度,串存放在MAXIZE个单元中,字符的序号和存储位置一致,应用更方便。
定长顺序串的基本操作
?: 串拼接操作+求子串操作+串操作比较
模式匹配
字符串的模式匹配:定位子串
蛮力匹配算法(BF):很好经典基础
KMP思想:防止主串指针回溯(从头再来),一条路走到黑,好马不吃回头草……
希望在某趟主串元素Si和子串Tj匹配失败后,主串指针i不回溯,子串T移动到和主串对应的某个位置上,使得Tk对准Si继续向右前行。关键是k!主串一直前进(后移),子串利用next函数计算子串指针移动位置K(匍匐前进)。
准备工作:next函数难点(看一遍有点难理解,两遍OK)计算K
例题:主串:s=“acabaabaabcacaabc” 子串:t=“abcaababc”。
过程示意:
重点:(敲黑板了)next函数(推导过程):
已经匹配的字符串主串 s 和子串 t 在进行一次匹配(匹配成功k个元素,使用匹配成功的子串k个元素和主串k个元素在匹配,把前面以匹配的又分割成一个匹配,有些递归思想的那)参考
字符串的堆存储
字符串名的存储映像
串名的存储映像是串名——串值内存分配对照表,也称为索引表。
//带串长的索引表
typedef struct {
char name[MAXNAME];//串名
int length;//串长
char *stradr;//起始地址
}LNode;
//带末尾指针的索引表
typedf struct{
char name[MAXNAME];
char *ctradr,*endr;
}ENode;
//带特征位置的索引表
typedef struct{
char name[MAXNAME];
int tag;
union {
char *stradr;
char value[3];
}uval;
}TNode;
堆存储结构
在内存中开辟能存储足够多串的、地址连续的存储空间,作为应用程序中所有串的可利用存储空间,即堆存储空间。