算法与数据结构 第四章 字符串(详解)

目录

一、判断题

二、选择题 


在开始之前,先为大家推荐两篇介绍该章两个主要算法的的文章,供大家参考。

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个。所以在计算时,要去除重复子串的情况。

4、算法与数据结构 第四章 字符串(详解)_第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次。

上面的题目均是博主在期末考试前总结的重难点,欢迎各位大佬指正错误或者给出更优质的解析。

你可能感兴趣的:(PTA算法与数据结构,数据结构,算法)