目录
一、判断题
二、选择题
在开始之前,先为大家推荐两篇介绍该章两个主要算法的的文章,供大家参考。
KMP算法详解:KMP算法(快速模式匹配算法)C语言详解
求后缀表达式:求后缀表达式
1、如果一个串中的所有字符均在另一串中出现,则说前者是后者的子串。F
解析:错,子串必须是连续的。
1、下面关于字符串的程序,其输出结果是
#include
void fun(char s[], char t) {
int i = 0;
while (s[i]) {
if (s[i] == t)
s[i] = t - 'a' + 'A';
i++;
}
}
int main() {
char str[100] = "abcdefg", c = 'd';
fun(str, c);
printf("%s\n", str);
return 0;
}
A.abcDefg
B.abcdefg
C.ABCdEFG
D.ABCDEFG
解析:t-’a’+’A’是求t对应的大写字母。该题用函数调用的方法,将给定字母在该字符串中对应的字母变为大写并输出。
2、串“ababaabab”的nextval为( )。
A.010100011
B.010104101
C.010101011
D.010102101
解析:ababaabab
next:011234234
nextval:010104101
例:aabbc
next:02121
nextval:00121
求next的时候用next[k]=k+1,第一个为0,其余没有的情况为1,其余为k+1
nextval的时候是将字符和p[k]的值比较,如果不同就为k,如果相同k=next[k],继续比较。
3、若串S="software",其子串的数目是
A.36
B.8
C.37
D.9
解析:首先,software没有重复字符,长度为8.1个字符的子串有8个;2个字符的子串有8-1个;3个字符的子串有8-2个;……7个字符的子串有8-6个;8个字符的子串有8-7个,总数是1+2+3……+8=36个,再加上一个空串,是37个。
但问题是很多情况下,子串有重复的情况,比如:abbbc,子串只有3+2+3+2+1=11个,而不是1+2+3+4+5=15个。又如,abab,子串有2+2+2+1个。所以在计算时,要去除重复子串的情况。
解析:两种求法:
第一种:第一位默认-1,之后的每一位是它之前的字符串最长公共前缀后缀长度;
第二种:第一位默认0,第二位默认1,之后每一位是它之前的字符串最长公共前缀后缀长度+1;
优化特征向量 nextval:
nextval的求解需要比较s中next[i]所在位置的字符是否与s[i]的字符一致,如果一致则用s[next[i]]的nextval的值作为nextval[i],如果不一致,则用next[i]做为nextval[i];
第一种方法:next={-1,0,0,0,1,2,1},nextval={-1,0,0,-1,0,2,1}
第二种方法:next={0,1,1,1,2,3,1},nextval={0,1,1,1,2,1,1}
5、设主串T=abaabaabcabaabc,模式串S=abaabc,采用KMP算法进行模式匹配,到匹配成功时为止,在匹配过程中进行的单个字符间的比较次数是:
A.15
B.12
C.10
D.9
解析:求next数组,next={-1,0,0,1,1,2};
开始匹配
abaabaabcabaabc
abaabc
当比较到s[5]时,不成功,比较6次;
abaabaabcabaabc
-----abaabc
根据next[5]=2,移动S到S[2]处,从S[2]处开始比较,比较4次,成功;
一共比较10次。
上面的题目均是博主在期末考试前总结的重难点,欢迎各位大佬指正错误或者给出更优质的解析。