数据结构第4章字符串:课后习题全解析(选择题+填空题+算法分析+计算题,含KMP的next函数)
本文是关于字符串处理的课后习题集,包含选择题、填空题、算法分析题和计算题。选择题考察字符串比较、指针操作和字符存储等基础知识;填空题测试字符串比较和模式匹配能力;算法分析题包含判断字符串对称性和统计子串出现次数的程序分析;计算题要求根据next函数定义和递推算法计算模式串的next值。题目涵盖字符串长度统计、子串匹配、字符比较等常见字符串操作,涉及指针、数组、结构体等多种编程概念,适合检验学生对字
第4章 字符串 课后习题
一、单项选择题
1. 以下程序段的结果是:c的值为( A)。
char *a[5] = {"12378", "1237", "1236789", "1237", "123708"};
int i, c = 0;
for (i = 0; i < 5; i++)
if (StrCmp(a[i], "1237") == 0) c++;
A. 2
B. 5
C. 0
D. 1237
2. 以下程序段的结果是:c的值为(B )。
char a[8] = "1236789", int *p = a, int c = 0;
while (*p++)c++;
A. 8
B. 7
C. 10
D. 12
3. 在C语言中,分别存储 "S" 和 's',各需要占用(D )字节。
A. 一个和两个
B. 两个
C. 一个
D. 两个和一个
4. (A )是字符串 "abcd321ABCD" 的子串。
A. "21ABC"
B. "abcABCD"
C. "abcD"
D. "321a"
5. 以下程序段的结果中,p指向( A)。
char a[] = "English";
char *p = a;
int n = 0;
while (*p != '\0') { n++; p++; }
A. 字符串的结束符
B. a
C. 字符 h
D. 7
二、填空题
1. 字符串 a1 = "BEIJING", a2 = "BEI", a3 = "BEFANG", a4 = "BEFI" 中最大的是 a1 。
2. 数组 a 经初始化,char a[] = "English"; a[7] 中存放的是 '\0' 。
3. 函数 StrCmp("abA", "aba") 的值为 -1 。
4. 设模式串 a1 = "aBc", a2 = "BCd", a3 = "ABC", a4 = "Abc",主串为 "ABcCDABcdEFaBc",能与主串成功匹配的模式串是 a1 。
三、算法分析题
1. 下列程序用来判断字符串是否对称,若对称则返回 1,否则返回 0,如 f("abba") 返回 1,f("abab") 返回 0。完成程序中的空格,并说明理由。
int (char * s)
{
int i = 0, j = 0;
while (s[j]) j++ ;
for (j --; i < j && s[i] == s[j] ; i++, j --)
return (i < j) 0:1 ;
}
2. 阅读下面的程序,做出简单分析,并说明其功能。
typedef struct
{
char data[MaxSize]; /* 存储串的最大长度为 MaxSize */
int len; /* 串的实际长度 */
} SString;
int count(SString * subs, SString * s)
{
int i = 0, j, k, count = 0;
for (i = 0; s -> data[i]; i++)
{
for (j = i, k = 0; (s -> data[j] == subs -> data[k]); j++, k++);
if (k == subs -> len - 1)
count ++;
}
return(count);
}
答:
功能说明:统计子串 subs 在主串 s 中出现的总次数
四、计算题
1. 设模式串 t = "ABAABC",j 为 t 中字符的位置,利用 next 函数的定义,试求 t 中第 j 个字符的 next 函数值,填于表 4-1。
表 4-1 计算题 1 表
| j | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| 模式 (t) | A | B | A | A | B | C |
| next (j) | 0 | 1 | 1 | 2 | 2 | 3 |
解析:
(1)根据next函数的定义:
j=1时,next(j)=0
j=2时,next(j)=1
(2)j=5时:
| j | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| next (j) | 0 | 1 | ||||
| ■ | ■ | ■ | ↓ | |||
| j=5 | A | B | A | A | B | C |
| ● | ● | ● | ||||
| ●子系列A等于子系列A,相等的子序列长度为1 ●子系列(A,B)不等于子系列(A,A),相等的子序列长度为0 ●子系列(A,B,A)不等于子系列(B,A,A),相等的子序列长度为0 比较结束,最大相等的子序列长度为1 next(5)=1+1=2 |
||||||
(3)j=6时:
| j | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| next (j) | 0 | 1 | ||||
| ■ | ■ | ■ | ■ | ↓ | ||
| j=6 | A | B | A | A | B | C |
| ● | ● | ● | ● | |||
| ●子系列A不等于子系列B,相等的子序列长度为0 ●子系列(A,B)等于子系列(A,B),相等的子序列长度为2 ●子系列(A,B,A)不等于子系列(A,A,B),相等的子序列长度为0 ●子系列(A,B,A,A)不等于子系列(B,A,A,B),相等的子序列长度为0 比较结束,最大相等的子序列长度为2 next(6)=2+1=3 |
||||||
(4)j=4时:
| j | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| next (j) | 0 | 1 | ||||
| ■ | ■ | ↓ | ||||
| j=4 | A | B | A | A | B | C |
| ● | ● | |||||
| ●子系列A等于子系列A,相等的子序列长度为1 ●子系列(A,B)不等于(B,A),相等的子序列长度为0 比较结束,最大相等的子序列长度为1 next(4)=1+1=2 |
||||||
(5)j=3时:
| j | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| next (j) | 0 | 1 | ||||
| ■ | ↓ | |||||
| j=3 | A | B | A | A | B | C |
| ● | ||||||
| ●子系列A等于子系列B,相等的子序列长度为0 比较结束,最大相等的子序列长度为0 next(3)=0+1=1 |
||||||
注:左边的子序列由第一个位置向右依次推进到 j-2 的位置结束(红色标记处);
右边的子序列由 j-1 的位置向左依次推进。
然后分别比较两个子序列是否相等,如果相等,则计算序列中元素的个数。
2. 设模式串 t = "BCBBC",j 为 t 中字符的位置,利用 next 函数值的递推算法求 t 中第 j 个字符的 next 函数值,填于表 4-2。
表 4-2 计算题 2 表
| j | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 模式 (t) | B | C | B | B | C |
| next (j) | 0 | 1 | 1 | 2 | 2 |
更多推荐




所有评论(0)