串的基本概念
串是由零个或多个字符组成的有限字符。
两个串相等当且仅当这两个串的长度相等并且各对应位置上的字符都相同。一个串中任意个连续字符组成的序列称为该串的子串。
空串是不包含任何字符的串,其长度为0,空串是任何串的子串
串的存储结构
串的顺序存储结构——顺序串
顺序串的存储方式:
- 非紧缩格式(存储密度小):每个字只存一个字符
- 紧缩格式(存储密度大):每个字存放多个字符
串的链式存储结构——链串
串采用链式存储结构时称为链串。 通常将链串中每个结点所存储的字符个数称为结点大小。
在链串中,结点大小越大,存储密度越大,适合串很少修改的情况;结点大小越小,相关操作的实现越方便,但存储密度下降。
串的模式匹配
设有两个串s和t,串t的定义就是要在串s中找到一个与t相等的子串。通常把s称为目标串,把t称为模式串,因此串定位查找也称为模式匹配。
模式匹配成功是指在目标串s中找到一个模式串t;不成功则指目标串s中不存再模式串t。
Brute-Force算法
Brute-Force(暴力)简称BF算法,也称简单匹配算法,采用穷举法,其基本思路是从目标串s=“s0s1s2……sn-1”的第一个字符开始和模式串t=“t0t1t2……tm-1”中的第一个字符比较,若相同,则继续逐个比较后续字符;否则从第二个字符开始重新比较。
依此类推,若从模式串s的第i个字符开始,每个字符依此和目标串t中的对应字符相等,则匹配成功,该算法返回位置i(表示此时t的第一个字符在s中出现的下标);否则,匹配失败,即t不是s的子串,算法返回-1。
KMP算法
在KMP算法中,通过分析模式串t从中提取加速匹配的有用信息。这种信息是对于t的每个字符tj(0≤j≤m-1)存放一个整数k(k<j),使得模式串t中开头的k个字符(t0t1t2……tk-1)依次与tj的前面k个字符(tj-k tj-k+1……tj-1,这里第一个字符tj-k最多从t1开始,所以k<j)相同。如果这样的k有多个,取其中最大的一个。模式串t中每个位置j的字符都有这种信息,采用next数组表示,即next[j]=MAX{k}。