串(字符串)是一种特殊的线性表,其数据元素为字符。如:"abc"。
一、串的定义
由字符构成的有限序列,是一种线性表。
串的比较:以字符的ASCII值作为依据。比较操作从两个字符串的第一个字符开始,字符的码值大者所在的串大;若其中一个串先结束,以串长较大者为大。
0:48
A:65
a:97
1-1、真题
真题1:
真题2:
此类题,套个示例即可。
二、串的模式匹配
串的定位操作,称为串的模式匹配。
设有两个串s和t,要在串s中找到与t相等的子串。通常将s称为目标串,t称为模式串,即:子串。
2-1、朴素模式匹配
时间复杂度:
最好:O(m)
最坏:O(n*m),(n-m+1)*m
平均:O(n+m)
2-2、KMP模式匹配
朴素模式匹配的改进。
改进之处:匹配过程,出现相比较的字符串不相等时,不需要回溯主串的指针,利用已经得到的部分匹配结果,将子串向后滑动尽可能远的距离,再继续比较。
计算子串向后滑动尽可能远的距离,就是计算next[j]的值。
前缀:包含第一个字符,但不包含最后一个字符的子串。
后缀:包含最后一个字符,但不包含第一个字符的子串。
最长相等前后缀:前缀和后缀相等的最长子串。
例如字符串“abca”
- 前缀:{a,ab,abc}
- 后缀:{a,ca,bca}
- 最长相等前后缀:a
第i个字符的next值 = 从1到i-1串中最长相等前后缀长度+1 。
特殊情况:
next[1] = 0
next[2] = 1
示例:求next[5]
len = 1时,前缀a = 后缀a,√
len = 2时,前缀aa = 后缀aa,√
len = 3时,前缀aaa = 后缀aaa,√
len = 4时,不可取,因为前缀包含了最后一个字符,后缀包含了第一个字符
所以,一共可取的最大len = 3,所以next[5] = 3+1 = 4。
KMP模式匹配的简单了解
当发生不匹配时,j回退,但是i不回退了,i会一直前进!!!
具体j回退到哪一位,就用next[j]求值。
因为,next[j] = next[5] = 4,所以,j回退到第四位。
好处,前j位和主串是匹配的。
2-3、真题
真题1:
真题2:
真题3:
真题4: