本文基于Coursera北大课程《数据结构基础》,所有文中非标注图片均来自课件,侵删
目录
4.2 KMP快速模式匹配(Knuth-Morrit-Pratt)
1. 字符串基本概念
1.1 什么是字符串
字符串是特殊的线性结构,即元素为字符的线性表。
设一个长度为N的字符串为S: "c0c1c2...cn-1",其中S为字符串串名,c0至cn-1则为串值,N为串长。
1.2 字符编码
在编码上,字符编码使用了单字节(8 bits)的ASCII码对128个符号进行编码;在更复杂的文字例如中文、日语、韩语字符时,使用UNICODE(16 bits)进行编码。判断字符串的大小是通过编码顺序判断的,字符编码表一般遵循约定俗成的“偏序编码规则”。
1.3 字符串数据类型
根据语言不同而不同,总体来说有简单类型和复合类型两种观念。
1.4 子串(substring)
子串就是从某个字符串中取出的一部分,而被取出的这个整体就是主串。
- 空串是任意串的子串。
- 任意串S都是S本身的子串。
- 真子串:非空且不为自身的子串。
2. 字符串的存储结构
字符串存为链表没有什么很大的优势,因为其操作通常都是以串为单位进行的,所以字符串更多是顺序存储。
对于串长变化不大的字符串,有三种常见的处理方案:
- 用S[0]作为记录串长的存储单元(Pascal)。缺陷是只有一个字节的长度来存这个值,所以字符串整体长度不能超过2^8=256 bits
- 为存储串的长度另找一个存储地址。缺陷是串的最大长度是fixed,不能动态申请数组空间。
- 用一个特殊的末尾标记,在C或C++中用'\0','\0'等价于NULL(注意这个末尾结束符不占字符串本身声明长度)
Pascal是一个有影响的面向对象和