第10讲 串 课堂互动 隐藏答案 | 返回首页

作者:欧新宇(Xinyu OU)

最后更新:2023-10-03


【课前自测10】

1. 设有两个串S1和S2,求S2在S1中首次出现的位置的运算称为( )。
A. 求子串
B. 判断是否相等
C. 模式匹配
D. 连接

答案及解析:C
本题易错选项是A,求子串操作是从串S中截取第i个字符起长度为l的子串,A错。BD明显错。

2. 已知串S='aaab',其next数组值为( )。
A. 0123
B. 0112
C. 0231
D. 1211

答案及解析:A
按规则next[1]=0,next[2]=1。对于j=3,部分匹配串为a,长度为1,因此next[3]=2。对于j=4,部分匹配串为aa,长度为2,因此next[4]=3。最终,next数组为[0123]

3. KMP算法的特点是在模式匹配时指示主串的指针( )。
A. 不会变大
B. 不会变小
C. 都有可能
D. 无法判断

答案及解析:B
在KMP算法的比较过程中,主串永不回溯,所以主串的指针不会变小。选B。

4. 设主串的长度为n,子串的长度为m,则简单的BF模式匹配算法和KMP算法的时间复杂度为( )。
A. O(mn) O(m+n)
B. O(n) O(m+n)
C. O(mn) O(n)
D. O(m+n) O(m+n)

答案及解析:A
尽管实际应用中,一般情况下简单的BF模式匹配算法的平均时间复杂度近似为O(m+n),但它的理论时间复杂度还是O(mn)。KMP算法的时间复杂度为O(m+n)。

5. 串是一种特殊的线性表,其特殊性体现在( )。
A. 可以顺序存储
B. 数据元素是一个字符
C. 可以链式存储
D. 数据元素可以是多个字符

答案及解析:B
串是一种逻辑结构,因此和大多数数据结构相同,都可以使用顺序存储或者链式存储进行存储,因此,选项A, C是一种常态,并不是特性。选项D体现的是串允许多个字符,但并不是它的根本特性,串的根本性质是,它是针对于字符的一种数据结构。因此,选项B是正确选项;

6. 在执行BF算法时,最坏的情况为每趟匹配比较,不等的字符出现的位置均为( )。
A. 模式串的最末字符
B. 主串的首字符
C. 模式串的首字符
D. 主串的最末字符

答案及解析:A
由于每次比较,模式串都会被反复比较的,而在BF算法中,最坏情况就是每次指针都从最后一位回退到第一位。因此当每次比较都是模式串的最末字符出现不等时,每次都将回退到起始位置的情况将会发生,此时属于最坏情况,此时的时间复杂度为O(mn)。

【课堂互动10.1】串的基本概念和BF匹配算法

1. 若串S=“structure”,那么以“t”为首到子串有( )个。
A. 11
B. 12
C. 24
D. 36

答案及解析:B
该题求的以“t”为首的子串,需要先考察串S中“t”的个数,不难发现,总共有2个。因此,以第一个t为首的子串包括:t, tr, tru, truc, truct, tructu, tructur, tructure,共8个;以第二给t为首的子串包括:t, tu, tur, ture,共4个。因此,总共有12个。

2. 下面关于串的叙述中,( )是不正确的。
A. 串是字符的有限序列
B. 空串是由空格构成的串
C. 模式匹配是串的一种重要运算
D. 串既可以采用顺序存储,也可以采用链式存储

答案及解析:B
空串是元素个数为零的串,而空格串是指由空格构成的串。

3. 串的长度是指( )。
A. 串中所含不同字母的个数
B. 串中所含字符的个数
C. 串中所含不同字符的个数
D. 串中所含非空格字符的个数

答案及解析:B

4. 串的模式匹配是指()。
A. 判断两个串是否相等
B. 对两个串进行大小比较
C. 查找某字符在主串中第一次出现的位置
D. 查找某子串在主串中第一次出现的第一个字符的位置

答案及解析:D
在串的模式匹配中,设有两个字符串S和T,设S为主串,T为模式串。在主串S中查找与模式T相匹配的子串,如果匹配成功,确定相匹配的子串中的第一个字符在主串S中出现的位置。

5. 设主串S="abccdcdccbaa",子串T="cdcc",用BF算法匹配第( )次可以匹配成功。
A. 5
B. 6
C. 7
D. 8

答案及解析:B
BF算法在进行匹配的时候,每一轮都需要执行回退操作,其中主串回退到上一轮起点的下一个结点,子串回退到子串本身的起点。本题中,匹配值为6-9的位置,因此总共需要执行6次匹配。

【课堂互动10.2】KMP匹配算法

1. 串'ababaaababaa'的next数组值为( )。
A. 01234567899
B. 012121111212
C. 011234223456
D. 0123012322345

答案及解析:C

j 1 2 3 4 5 6 7 8 9 10 11 12
字符串 a b a b a a a b a b a a
部分匹配字符 - - - a ab aba a a ab aba abab ababa
部分长度 0 0 0 1 2 3 1 1 2 3 4 5
next 0 1 1 2 3 4 2 2 3 4 5 6

2. 串'ababaaababaa'的next数组为( )。
A. -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 8
B. -1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1
C. -1, 0, 0, 1, 2, 3, 1, 1, 2, 3, 4, 5
D. -1, 0, 1, 2, -1, 0, 1, 2, 1, 1, 2, 3

答案及解析:C
注意本题的解题方法和常规方法相同,但此题起始值为-1,即数组位序从-1开始,因此需要将获得的next值减去1。

j 1 2 3 4 5 6 7 8 9 10 11 12
字符串 a b a b a a a b a b a a
部分匹配字符 - - - a ab aba a a ab aba abab ababa
部分长度 0 0 0 1 2 3 1 1 2 3 4 5
next 0 1 1 2 3 4 2 2 3 4 5 6

最终,next数组 = [011234223456] - 1 = [-100123112345]。

3. 串'ababaaababaa'的nextval数组为( )。
A. 0, 1, 0, 1, 1, 2, 0, 1, 0, 1, 0, 2
B. 0, 1, 0, 1, 1, 4, 1, 1, 0, 1, 0, 2
C. 0, 1, 0, 1, 0, 4, 2, 1, 0, 1, 0, 4
D. 0, 1, 1, 1, 0, 2, 1, 1, 0, 1, 0, 4

答案及解析:C

j 1 2 3 4 5 6 7 8 9 10 11 12
字符串 a b a b a a a b a b a a
部分匹配字符 - - - a ab aba a a ab aba abab ababa
部分长度 0 0 0 1 2 3 1 1 2 3 4 5
next 0 1 1 2 3 4 2 2 3 4 5 6
nextval 0 1 0 1 0 4 2 1 0 1 0 4

4.【2015统考真题】已知字符串S为'abaabaabacacaabaabcc',模式串t为'abaabc'。
采用KMP算法进行匹配,第一次出现“失配”(s[i]≠t[j])时,i=j=5,则下次开始匹配时,i和j的值分别是( )。
A. i=1,j=0
B. i=5,i=0
C. i=5,i=2
D. i=6,j=2

答案及解析:C
在KMP算法中,主串指针永不会退,因此i=5。当j=5时,新的j值next[5]=2。具体解法, next[1]=0, next[2]=1, next[3]=1, next[4]=2, next[5]=2。

5.【2019统考真题】设主串T='abaabaabcabaabc',模式串S='abaabc',采用KMP算法进行模式匹配,到匹配成功时为止,在匹配过程中进行的单个字符间的比较次数是( )。
A. 9
B. 10
C. 12
D. 15

答案及解析:B
此题主要考察模式串回退的距离,对于模式串abaabc,可以得到next数组[011223]。根据题意可知,第一轮匹配,总共比较了6次。失配时,j=6,next[6]=3,因此,下一轮匹配时,使用模式串的3号位和主串的6号进行对比,总共比较了4次,匹配成功。因此,总比较次数为6+4=10。

【扩展练习10】

1. 若串 S = "software",其子串的数目是( )。
A. 8
B. 37
C. 36
D. 9

答案及解析:C
子串是指地址连续的字符的集合,在本题中包含8个字符的子串有1个,7个字符的子串2个,以此类推,子串的数量=8+7+6+5+4+3+2+1=36。

2. 串"ababaabab"的nextval数组为( )。
A. 010104101
B. 010102101
C. 010100011
D. 010101011

答案及解析:A

j 1 2 3 4 5 6 7 8 9
字符串 a b a b a a b a b
next 0 1 1 2 3 4 2 3 4
nextval 0 1 0 1 0 4 1 0 1

3.(填空题)已知模式串 t="abcaabbabcab",试写出用KMP算法求得的每个字符对应的next和nextval数组值。next =_______,nextval = ________。

答案及解析:next[] = 011122312345, nextval[] = 011021301105

j 1 2 3 4 5 6 7 8 9 10 11 12
字符串 a b c a a b b a b c a b
部分匹配字符 - - - - a a ab - a ab abc abca
部分长度 0 0 0 0 1 1 2 0 1 2 3 4
next 0 1 1 1 2 2 3 1 2 3 4 5
nextval 0 1 1 0 2 1 3 0 1 1 0 5

4. (应用题)设有字符串S="aabaabaabaac",P="aabaac"。
1) 求出P的next数组。
2) 若S做主串,P做模式串,试给出KMP算法的匹配过程。

答案及解析:
(1)next数组计算方法:next[1] = 0; next[2] = 1; 存在部分匹配 ? n+1 : 1

j 1 2 3 4 5 6
字符串 a a b a a c
部分匹配字符 - - a - a aa
部分长度 0 0 1 0 1 2
next 0 1 2 1 2 3

(2)KMP算法的匹配过程

主串 a a b a a b a a b a a c
  a a b a a c  
主串 a a b a a b a a b a a c
  a a b a a c  
主串 a a b a a b a a b a a c
  a a b a a c

第10讲 串 课堂互动 隐藏答案 | 返回首页