PTA数据结构与算法-第四章——字符串

PTA习题 专栏收录该内容
52 篇文章 4 订阅


第一章——褚论

第二章——线性表

第三章——栈与队列

第四章——字符串

第五章——树与二叉树

第六章——图

第七章——排序

第八章——检索


判断题

1-10
如果strcmp(s1,s2)返回的结果为0,表示字符串s1和s2不相同。
F

当s1<s2时,返回值<0;
当s1=s2时,返回值=0;
当s1>s2时,返回值>0;


1-4
假设模式串是abababaab,则KMP模式匹配算法中的next[j] = 0 1 1 2 3 4 5 6 2。
next[j]就是第j个元素前j-1个元素首尾重合部分个数加一
KMP算法详解

根据上面文章的内容可得到:
j的下标从1开始
j=1时,规定next[1]=0;
j=2时,s[2]前(下标从1开始)有"a",首尾重合个数为0,故next[2]=0+1=1
j=3时,s[3]前有"ab",首尾重合个数为0,故next[3]=0+1=1;
j=4时,s[4]前有"aba",首尾重合个数为1,故next[4]=1+1=2;
同理,
j=5时,“abab”…2…next[5]=2+1=3;
j=6时,“ababa”…3…next[6]=3+1=4
j=7时,“ababab”…4…next[7]=4+1=5;
j=8时,“abababa”…首尾重合有"ababa",个数为5,
故next[8]=5+1=6;
j=9时,“abababaa”…首尾重合有"a",个数为1,
故next[9]=1+1=2;


1-3
(nueDS_C++)如果一个串中的所有字符均在另一串中出现,则说前者是后者的子串。

F 还和顺序对应有关


1-1
char * s=“C Language”;表示s是一个指向字符串的指针变量,把字符串的首地址赋予s。
T


1-2
字符串在内存中的起始地址称为字符串的指针,可以定义一个字符指针变量指向一个字符串。
T


1-4
(neuDS_C++)空串与空格串是相同的。
F


1-5
指针变量可以存放指针(地址)、数值和字符。
F


1-8
重载运算符可以保持原运算符的优先级和结合性不变。
T


1-12
字符串常量在内存中的存放位置由系统自动安排。
T


1-13
调用strcmp函数比较字符串大小时,通常较长的字符串会较大。
F strcmp函数的比较是一位一位的比较ascii码值,只要对应有一位的ascii码值不相同,即得出大小结果,与后面剩下的字符都无关。


1-14
字符串常量就是用一对双引号括起来的字符序列,它有一个结束标志’\0’。
T


1-15
对于两个字符串变量s1和s2,使用if(s1>s2)来比较大小是可以的。
F 不可以,只可以用函数strcmp()


1-16
判断字符串a和b是否相等的表达式为if (a==b)。
F 同样需要用strcmp()函数来比较


单选题

2-14
令s=“abcabaa”,则它的特征向量next函数值和优化特征向量nextval函数值为(下标从0开始):
next={0,1,1,1,2,3,2},nextval={0,1,1,0,1,2,1}
next={-1,0,0,-1,0,2,1},nextval={-1,0,0,0,1,2,1}
next={-1,0,0,0,1,2,1},nextval={-1,0,0,-1,0,2,1}
next={-1,0,0,0,1,2,1},nextval={-1,0,0,0,1,2,1}

参考1-4的做法可以得到next数组
规定next[1]=0
s[2]前,“a”,next[2]=重合个数0+1=1
s[3]前,“ab”,next[3]=重合个数0+1=1
s[4]前,“abc”,next[4]=重合个数0+1=1
s[5]前,“abca”,next[5]=重合个数1+1=2
s[6]前,“abcab”,next[6]=重合个数2+1=3
s[7]前,“abcaba”,next[7]=重合个数1+1=2
next[j]函数值为{0,1,1,1,2,3,2}(这里下标是从1开始)
题目中下标从0开始,故函数值都减1,得到
next={-1,0,0,0,1,2,1}.

求解优化特征向量nextval详解

从文章内容分析本题
上面已经求得next={0,1,1,1,2,3,2}
规定nextval[1]=0(下标从1开始)
观察s[1]和s[2],(下标从1开始),a和b不相同,故
nextval[2]=1
求nextval[3]时,看next[3],next[3]=1,观察s[1]和s[3],a和c不相等,故nextval[3]=next[3]=1.
求nextval[4]时,next[4]=1,s[1]和s[4]为a和a,相等,nextval[4]=0;
求nextval[5]时,next[5]=2,s[2]和s[5]为b和b,相同,看next[2]=1,比较s[1]和s[2]为a和b,不相同,则nextval[5]=next[2]=1;
next[6]=3,s[3]和s[6]为c和a,不相同,nextval[6]=next[6]=3;
next[7]=2,s[2]和s[7]为b和a,不相同,nextval[7]=2
综上可以得到nextval={0,1,1,0,1,3,2}
而题目中要求从下标0开始,则将其减1得到
{-1,0,0,-1,0,2,1}


2-21
设主串 T = abaabaabcabaabc,模式串 S = abaabc,采用 KMP 算法进行模式匹配,到匹配成功时为止,在匹配过程中进行的单个字符间的比较次数是:
9
10
12
15

解析:
1.求S的next数组,(下标从0开始)next={-1,0,0,1,1,2}
2.开始匹配

  • abaabaabcabaaba
    abaabc
    当比较到s[5]和T[5]时,不成功,比较了6次
  • 根据next[5]=2,将s移动到s[2]处和T[5]开始重新匹配比较:
    abaabaabcabaaba
    -----abaabc
    比较4次,成功,结束匹配。
  • 一共比较了6+4=10次;

2-6
串“ababaabab”的nextval为( )。
010104101
010102101
010100011
010101011

解析:
用第一位默认-1的求法求next

  • 默认next[0]=-1;
  • next[1]是看s[1]之前的字符串“a”中前后重复的子串长度为0,(本身不算),故next[1]=0;
  • next[2]是看s[2]之前字符串"ab"中前后重复的子串长度为0,故next[2]=0;
  • next[3]是看s[3]之前字符串"aba"中前后重复子串长度为1,故next[3]=1;
  • next[4]是看s[4]之前字符串"abab"中前后重复子串长度为2,故next[4]=2;
  • next[5]……“ababa” ……重复子串长度为3,故next[5]=3;
  • next[6]……“ababaa”……1……next[6]=1;
  • next[7]……“ababaab”……2……next[7]=2;
  • next[8]……“ababaaba”……3……next[8]=3;
  • 综上:next={-1,0,0,1,2,3,1,2,3}

求nextval:(下标从0开始的方法)
规定nextval[0]=-1
比较s[ next[i] ]和s[ i ]

  • 若不相等,则nextval [ i ] =next [ i ];
  • 若相等,则nextval [ i ] = nextval [ next [ i ] ];

本题解析:

  • nextval[0]=-1,和next[0]的值一样;
  • nextval[1],next[1]=0,比较s[1]和s[0],为a和b,
    不相等,则nextval[1]=next[1]=0;
  • nextval[2],next[2]=0,比较s[2]和s[0],为a和a,
    相同,nextval[2]=nextval[ next[2] ]=nextval[0]=-1;
  • nextval[3],next[3]=1,比较s[3]和s[1],为b和b,
    相同,nextval[3]=nextval[next[3]]=nextval[1]=0;
  • nextval[4],next[4]=2,比较s[4]和s[2],为a和a,
    相同,nextval[4]=nextval[ next[4] ]=nextval[2]=-1;
  • nextval[5],next[5]=3,比较s[5]和s[3],为b和a,不相同,nextval[5]=next[5]=3;
  • nextval[6],next[6]=1,比较s[6]和s[1],为b和b,
    相同,nextval[6]=nextval[1]=0;
  • nextval[7],next[7]=2,比较s[7]和s[2],为a和a,
    相同,nextval[7]=nextval[2]=-1;
  • nextval[8],next[8]=3,比较s[8]和s[3],为b和b
    相同,nextval[8]=nextval[3]=0;
    综上所述
    nextval={-1,0,-1,0,-1,3,0,-1,0}
    根据题目选项可得题目应该是下标从1开始的做法,故将函数值依次加1即可:
    nextval={0,1,0,1,0,4,1,0,1}

2-15
(neuDS)设有两个串p和q,其中q是p的子串,求q在p中首次出现的位置的算法称为( )。
求子串
联接
模式匹配
求串长


2-16
(neuDS)串也是一种线性表,只不过( )。
数据元素均为字符
数据元素是子串
数据元素数据类型不受限制
表长受到限制


2-17
KMP算法下,长为n的字符串匹配长度为m的字串的时间复杂度为
O(N)
O(M+N)
O(M+LOGN)
O(N+LOGM)


2-18
下面关于串的叙述中,哪一个是不正确的
串是字符的有限序列
空串是由空格构成的串
模式匹配是串的一种重要运算
串既可以采用顺序存储,也可以采用链式存储

空串是不含字符的串,空格也算字符。


2-19
若串S=“software”,其子串的数目是
8
37
36
9
解析
插板法:用两个隔板夹取某些字符,长度不限,取尽所有长度
software有8个字符,则有9个空,用组合排序即:
C(2 9)=9*8/2=36,再加上空串,也就是37种。


2-20
串的长度是指

串中所含不同字母的个数
串中所含字符的个数
串中所含不同字符的个数
串中所含非空格字符的个数


2-7
下述对C语言字符数组的描述中错误的是()。

字符数组可以存放字符串
字符数组中的字符串可以整体输入、输出
可以在赋值语句中通过赋值运算符"="对字符数组整体赋值
不可以用关系运算符对字符数组中的字符串进行比较


2-8
(neuDS)设主串的长度为n,模式串的长度为m,则串匹配的KMP算法时间复杂度是( )。

O(m)
O(n)
O(n + m)
O(n×m)


2-10
下面关于字符串的程序,其输出结果是

#include <stdio.h>

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;
}

abcdefg
abcDefg
ABCdEFG
ABCDEFG


2-12
(neuDS_C++)串是一种特殊的线性表,其特殊性体现在( )。

可以顺序存储
数据元素是一个字符
可以链接存储
数据元素可以是多个字符


2-13
(neuDS_C++)设串s1=’ABCDEFG’,s2=’PQRST’,函数con (x,y)返回x和y串的连接串,subs(s,i,j)返回串s的从序号i的字符开始的j个字符组成的子串,len(s)返回串s的长度,则con (subs (s1,2,len (s2)), subs (s1,len (s2),2))的结果串是( )。

BCDEF
BCDEFG
BCPQRST
BCDEFEF


  • 1
    点赞
  • 0
    评论
  • 4
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

1.两个串相等的充要条件是( )。A.串长度相等B.串长度任意 C.串中各位置字符任意 D.串中各位置字符均对应相等 2.对称矩阵的压缩存储:以行序为主序存储下三角中的元素,包括对角线上的元素。二维下标为( i, j ),存储空间的一维下标为k,给出k与 i, j (i<j)的关系k=( ) (1<= i, j <= n , 0<= k < n*(n+1)/2)。 A.i*(i-1)/2+j-1 B.i*(i+1)/2+j C.j*(j-1)/2+i-1 D.j*(j+1)/2+i 3.二维数组A[7][8]以列序为主序的存储,计算数组元素A[5][3] 的一维存储空间下标 k=( )。 A.38 B.43 C.26 D.29 4.已知一维数组A采用顺序存储结构,每个元素占用4个存储单元,第9个元素的地址为144,则第一个元素的地址是( )。A.108 B.180 C.176 D.112 5. 下面( )不属于特殊矩阵。 A.对角矩阵 B. 三角矩阵C. 稀疏矩阵 D. 对称矩阵 6. 假设二维数组M[1..3, 1..3]无论采用行优先还是列优先存储,其基地址相同,那么在两种存储方式下有相同地址的元素有( )个。 A. 3 B. 2 C. 1 D. 0 7. 若Tail(L)非空,Tail(Tail(L))为空,则非空广义表L的长度是( )。(其中Tail表示取非空广义表的表尾) A. 3 B. 2 C. 1 D. 0 8.串的长度是( )。 A.串中不同字母的个数 B.串中不同字符的个数C.串中所含字符的个数,且大于0 D.串中所含字符的个数 9.已知广义表(( ),(a), (b, c, (d), ((d, f)))),则以下说法正确的是( )。A.表长为3,表头为空表,表尾为((a), (b, c, (d), ((d, f))))B.表长为3,表头为空表,表尾为(b, c, (d), ((d, f)))C.表长为4,表头为空表,表尾为((d, f)) D.表长为3,表头为(()),表尾为((a), (b, c, (d), ((d, f))))10.广义表A=(a,b,c,(d,(e,f))),则Head(Tail(Tail(Tail(A))))的值为( )。(Head与Tail分别是取表头和表尾的函数) A.(d,(e,f)) B.d C.f D.(e,f)二、填空题(每空 2 分,共 8 分)。 1.一个广义表为 F = (a, (a, b), d, e, (i, j), k),则该广义表的长度为________________。GetHead(GetTail(F))= _______________。 2.一个n*n的对称矩阵,如果以行或列为主序压缩存放入内存,则需要 个存储单元。 3.有稀疏矩阵如下: 0 0 5 7 0 0 -3 0 0 0 4 0 0 2 0 它的三元组存储形式为: 。 三、综合题(共 22 分)。 1.(共8分)稀疏矩阵如下图所示,描述其三元组的存储表示,以及转置后的三元组表示。 0 -3 0 0 0 4 0 6 0 0 0 0 0 0 7 0 15 0 8 0 转置前(4分): 转置后(4分): 2. (共14分)稀疏矩阵M的三元组表如下,请填写M的转置矩阵T的三元组表,并按要求完成算法。 (1)写出M矩阵转置后的三元组存储(6分): M的三元组表: T的三元组表: i j e 2 1 3 3 2 4 4 2 5 4 3 5 5 1 6 5 3 6 i j e (2)如下提供了矩阵采用三元组存储时查找指定行号(m)和列号(n)元素值的算法框架,将代码补充完整(每空2分,共8分)。 typedefstruct{ inti,j; ElemType e; }Triple; typedefstruct{ Triple data[MAXSIZE+1]; //data[0]未用 intmu,nu,tu; //矩阵的行数,列数和非零元的个数 }TSMatrix; voidFind_TSMatrix(TSMatrix M, int m, int n, ElemType&e) //M为要查找的稀疏矩阵三元组存储,m为要查找的元素的行号,n为列号,e为查找后得到的值。 { for ( i=1 ; i<=M.tu ;i++) if( && ) { e=M.data[i].e; ; } if( ) e=0; }
相关推荐
©️2020 CSDN 皮肤主题: 黑客帝国 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值