概述
- 字符串: 由零个或多个字符组成的有限序列。
- 记法:
s = "a1, a2, ...,an";
- 空字符: Φ \Phi Φ =
""
- 空格串: 只包含空格的字符串
- 子串: 串中任意个数的连续字符组成的子序
- 字符串相邻字符之间具有前驱和后继的关系。
- 子串在主串中的位置是子串的
第一个字符在主串序列的序号
- 通过比较串的字符之间的编码来进行的,而字符的编码值为字符在对应字符集中的序号
ASCII 8位二进制表示一个字符,用于表示英文、数字、特殊字符等
Unicode16位二进制数表示一个字符,可以表示世界上所有语言的所有字符
抽象数据类型

存储结构
顺序存储
- 串的顺序存储结构时用一组地址连续的存储单元来存储串中的字符序列中的。

链式存储
- 串的链式存储结构与线性表相似,但是串的每个结点可以存储一个或多个字符,最后一个结点若未占满则使用
#或其他非字符串字符补全
- 总体来说,串的链式存储结构不如顺序存储结构灵活,性能也不如顺序存储结构好

朴素模式匹配算法
- 模式匹配是指自串的
定位操作
- 对主串的每个字符作为子串的开头,与要匹配的字符串进行匹配;
- 对主串进行大循环,每个字符开头都要做T的长度的小循环,直到匹配成功或全部遍历完成为止

int Index(String S, String T, int pos)
{
int i = pos;
int j = 1;
while(i <= S[0] && j <=T[0])
{
if(S[i] == T[j])
{
++i;
++j;
}
else
{
i = i - j + 2;
j = 1;
}
}
if(j > T[0])
return i - T[0];
else
return 0;
}

KMP模式匹配算法
- 朴素模式匹配算法会进行大量重复且无用的比较,因此效率很低。
- KMP算法:克努力-莫里斯-普拉特算法可以大大避免重复遍历。

- 基本思想:


S = "abcabcabc" "T = abcabx",在①中前5个字符完全相等,第6个字符不等
T的首字符a和T的第二个字符b,第三个字符c均不相等,所以不需要做判断,步骤② ③都是多余的
- 因为
T的首位a与T第四位的a相等, 第二位的b与第五位的b 相等。 而在①时, 第四位的a与第五位的b 已经与主串S中的相应位置比较过了, 是相等的;因此可以断定 ,T的首字符a、 第二位的字符b与S的第四位字符和第五位字符也不需要比较了,肯定也是相等的,因此步骤 ④ ⑤ 也可以省略
j值的变换和主串没什么关系,关键就取决于子串的结构中是否有重复的问题
- 我们把T串各个位置的
j值的变化定义为一个数组next,那么next的长度就是T串的长度
n e x t [ j ] = { 0 , 当 j = 1 时 M a x { k ∣ 1 < k < j , 且 ′ p 1 . . . p k − 1 ′ = ′ p j − k + 1 . . . p j − 1 ′ } 当 此 集 合 不 空 时 1 , 其 他 情 况 next[j] = \begin {cases} 0, \text \ \ \ {当j = 1时} \\ Max\ \ \ \{k|1<k<j,且'\ p_1\ ...\ p_{k-1}\ ' = '\ p_{j-k+1}\ ...\ p_{j-1}\ ' \}当此集合不空时 \\ 1, \text \ \ \ {其他情况}\end {cases} next[j]