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


第一章——褚论

第二章——线性表

第三章——栈与队列

第四章——字符串

第五章——树与二叉树

第六章——图

第七章——排序

第八章——检索


判断题

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


  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值