数据结构与算法 复习笔记 第四章 字符串 概念/存储结构和实现/模式匹配

字符串是组成元素(结点)为单个字符的线性表,简称“串”。
字符串所包含的字符个数称为字符串的长度。长度为零的串称为空串,不包含任何字符内容。
尽管字符串是一种特殊的线性表,但其逻辑结构与线性表相比存在一定的区别:
(1)字符串的数据对象约束为字符集。
(2)线性表的基本操作大多以“单个元素”为操作对象,而字符串的基本操作通常以“串的整体”作为操作对象。

4.1字符串的基本概念

4.1.1字符编码

组成字符串的字符可以是数字、文本字符或者特定的符号,只要它们存在允许的字符集合中。
在C/C++等程序设计语言中,字符类型是单字节的基本数据类型,采用ASCII(americanstandard code for information interchange,美国标准信息交换码)编码标准对字符进行编码,每个字符用一个字节表示,其中低7位表示字符,最高位均为0。
为了解决互通问题,达到信息共享的目的,产生了“通用文字符号编码标准”UNICODE。

4.1.2字符的编码顺序

为了方便字符串的比较和运算,字符编码表一般遵循约定俗成的“偏序编码规则”,根据字符串的自然含义。

字符串的抽象数据类型字符串在逻辑结构上很简单,属于简单的线性表结构。如果线性表的元素为一个确定的字符集中按照某种确定方式进行编码的字符,则构成一个字符串。
在C/C++中,用双引号括起来的一串文字即为一个字符串常量,可以初始化或赋值给某个字符串变量。
常用的字符串操作包括:在字符串的末尾添加字符;把两个或更多串连接在一起;将一个串0 复制到另一个串中;在字符串中搜索一个给定字符或子串等。

【代码4.1】字符串的抽象数据类型定义

class string {
private: // 字符串的存储结构在具体实现时定义
//…// 字符串的数据表示,例如 char stri
//…//串的当前长度,例如 int size;
public: // 字符串的运算集
string();// 创建一个空字符串
string(char
s); // 创建一个初值为s的字符串
~string();// 消除该串实例
int length(); // 返回串的长度
int isEmpty(); // 判断串是否为空串
void clear(); // 把串清空
string append(const char c); // 在串尾添加字符
string concatenate(const char* s); // 把串s连接在本串后面
string copy(const char* s);// 将一个串s复制到本串
string insert(const char c, const int index);// 往串中给定位置插入一个字符
int find(const char e, const int start); // 从位置 start 开始搜索串寻找一个给定字符
string substr(const int s, const int len); //从位置。开始提取一个长度为len的子串
}

4.2字符串的存储结构和实现

对于字符串长度分布变化不大的情况,字符串采用顺序存储比较合适。
标准字符串需要在其末尾带一个结束标志‘\0’来表示字符串的结束,因此字符串的长度最大不能超过M-1.

4.3字符串的模式匹配

朴素&KMP(KMP很重要)
https://blog.csdn.net/qq_40395874/article/details/80467572

本章小结

字符串是由零个或多个字符顺序排列组成的有限序列。它是一种特殊的线性表,其特殊性主要体现在组成表的每个元素均为一个字符以及与此相应的一些特殊操作。一个字符串中所包贪的字符的个数为非的长度,长度为零的字符称为空字符串。主字符串S,中若干个连续字符组成的子序列S2被称为S1的子串,而S1被称为S2的主串。
选择字符串的存储结构时要考虑字符串的变长特点。
顺序存储使用类型为char的一维定长数组,访同学符串中的单个字符或连续的一组字符比较容易,但进行插入和删除(增减字符)操作就不太方便,因为需要移动相关的字符。为了更方便地处理字符串,避免静态定长字符串数组的问题,有些字符串类的存储结构和实现方案提供了动态的字符串存储空间管理。
常用的字符串运算包括字符串的复制、求长度、比较、拼接、抽子串、寻找字符等。根据存储结构的不同,这些运算的实现也有所不同。
模式匹配是一个比较复杂的串操作,是子串(模式)在主串(目标串)中的定位操作。常用的模式匹配算法有朴素的原始匹配算法和经过优化改进的无回溯算法。
朴素的模式匹配比较直观,易于理解,但由于回溯而使复杂度提高,其时间代价与目标串长度和模式串长度的乘积成正比。
无回溯的模式匹配中最具代表性的是KMP算法。它对模式本身的字符分布特征进行分析,生成模式的特征向量,并在匹配的过程中利用模式的待征向量,以提高模式匹配的效率,其时间代价是目标串长度的线性函数,计算模式特征向量的时间也与模式本身的长度成正比。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值