🔑数据结构_第四章:串
第四章、串
(一)串的定义和实现
1、定义
串,即字符串String
,是由零个或多个字符组成的有限序列。一般记为:
$$
S=\ ‘a_1a_2…a_n’\ \ (n \ge 0)
$$
其中,
S
是串名,单引号或双引号括起来的是串的值。ai可以是字母、数字或其它字符。
串中字符的个数
n
称为串的长度。n=0
的串称为“空串”,用Φ表示。相关定义:
子串:
串中任意两个连续的字符组成的子序列。
主串:
包含子串的串。
字符在主串中的位置:
字符在串中的序号,一般都是从1开始。
子串在主串中的位置:
子串中第一个字符在主串中的位置。
注意事项:
- 串的数据对象限定为字符集(如中文字符、英文字符、数字字符、标点字符等)
- 串的基本操作——如增删改查——通常以子串为操作对象,而不是单个字符!
2、串的基本操作
(1)赋值
StrAssign(&T,chars)
:把串T
赋值为chars
。
(2)复制
StrCopy(&T,S)
:由串S
复制得到串T
。
(3)判空
StrEmpty(S)
:若S
为空串,则返回TRUE
,否则返回FALSE
。
(4)求串长
StrLength(S)
:返回串S
的元素个数。
(5)清空
ClearString(&S)
:将S
清空为空串。
(6)销毁
DestroyString(S)
:将串S
完全销毁——回收存储空间。
(7)联接
Concat(&T,S1,S2)
:用T
返回由S1
和S2
联接而成的新串。
(8)求子串
SubString(&Sub,S,pos,len)
:用Sub
返回串S
的第pos
个字符起长度为len
的子串。
(9)定位
Index(S,T)
:若主串S
中存在与串T
值相同的子串,则返回它在主串S
中第一次出现的位置;否则返回0
。
(10)比较
StrCompare(S,T)
:若S>T
则返回值>0,若S<T
则返回值<0,且返回值为二者差值;若二者相等则返回0
。
3、串的存储结构
也是有顺序存储和链式存储两种。
(1)顺序存储
1 |
|
常见的记录串长的方法:

(2)链式存储
1 | //********串的存储结构——链式存储******** |
(二)串的模式匹配
什么是字符串的模式匹配?
从字符串
A
里面搜寻B
,A
叫做主串,B
叫做模式串。字符串模式匹配:在主串中找到与模式串相同的子串,并返回其所在位置。
注:模式串不是子串,二者不是同一概念!
在408考试中需要掌握两种模式匹配算法:
朴素模式匹配算法和KMP算法。
1、朴素模式匹配算法
原理:在主串中枚举所有与模式串相同长度的子串,逐一对比即可。(突出一个朴素暴力)

主串长度为m
,模式串长度为n
时,主串中有m-n+1
个与模式串长度相同的子串,比较/匹配次数也是这么多次。
最坏时间复杂度为O(mn)
。
2、KMP
算法——考研算法难度排名前三
注:匹配之前,我们首先需要对模式串进行预处理,弄清楚模式串里有哪些特征哪些字符是重复的,这样匹配失败时就不用挨个字符往后挪了,以便后续进行更高效的匹配:
开始与主串的第一个子串匹配:

在第五个位置匹配错误,那么主串中前四个位置的元素我们已经知道了/与模式串对应,下一轮匹配只需将模式串移动到第*4*个位置、匹配第五个位置的元素:

匹配失败,下一轮将模式串移动到第*6*个位置开始匹配:

同理:

同理:

同理:

每次匹配失败后模式串需要往后移动几个位置,这就需要预处理,处理结果保存为数组(
next[]
);时间复杂度:
- 求
next[]
数组时间复杂度为O(m)
; - 模式匹配过程最坏时间复杂度为
O(n)
;
因此该算法的最坏时间复杂度为
O(m+n)
。- 求