目录
(重点是字符串模式匹配:KMP匹配算法,next数组及推理,了解nextval数组的求解)
4.1 串的基本概念
4.1.1 串的定义
Def:由零个或多个字符组成的有限序列
·子串:一个串中任意多个连续的字符组成的子序列(包含空串)
·主串:包含子串的串
·字符位置:某个字符在串中的序号为该字符在串中的位置
·子串位置:子串的第一个字符在主串中的位置
·空格串:由一个或多个空格组成的串(注意与空串的区分)
·串相等:两个串的长度且每个对应位置的字符都相等
【例】:
·串的抽象类型定义:
【串与线性表的区别】:串的逻辑结构与线性表相似,区别仅在于串的数据对象限定为字符集;在基本操作上和线性表差别较大,线性表主要以单个元素为操作对象,而串的基本操作通常以子串为操作对象
4.1.2 串的存储结构
(1)串的顺序存储
(2) 串的链式(块链)存储
该方式操作方便,但存储密度低(存储密度=串值所占存储/实际分配的存储),为了改进可以将多个字符存放在一个结点中,此时每个结点称为块:
4.2 串的模式匹配算法
算法目的:确定主串中的子串(模式)第一次出现的位置
(例如文档中查找关键字的操作;搜索引擎;拼写检查等)
4.2.1 BF算法(Brute-Force)
·思路:利用穷举法的思路,从主串的每一个字符开始依次与子串的字符进行比较
·具体过程:设主串S=aaaaab,子串T=aaab
·具体实现:
·时间复杂度:若主串长度n,子串长度m;最好的情况下比较m次,即O(m);最坏的情况下主串前面的n-m个位置都比较到了的最后一位,即比较了(n-m)*m次,到最后m位时也各比较一次即m次,最终总次数(n-m+1)*m次,当m<<n,时间复杂度O(n*m)
4.2.2 KMP算法
·思想:相较BF算法主串S的指针i不必回溯,为此,定义next[j]函数,表明当模式中第j个字符与主串中相应字符"失配”时,在模式中需重新和主串中该字符进行比较的字符的位置。此时算法复杂度可提高到O(n+m)。
·next函数的公式:
·next函数的推理:
·具体实现:
·改进的KMP:当出现Pj=Pnext[j]时,需再次递归,将next[j]修正为next[next[j]],直至二者不再相等,更新后的数组命名为nextval