对客观题进行了摘选~~~
1.串 S=‘aaab’的 Next 数组值为1123. (X)
借此题学习一下next数组的求法
解法一:肉眼观察法(自己取的名字…)
假设有一个S=‘abcabaac’的字符串(比题目的更一般)
S[1]之前没有元素,next[1]=0;
S[2]之前只有S[0],next[2]=1;
S[3]之前有‘ab’,没有相同的前后缀,next[3]=1;
S[4]之前有‘abc’,没有相同的前后缀,next[4]=1;
S[5]之前有‘abca’,最大相同的前后缀为‘a’,next[5]=2;
S[6]之前有‘abcab’,最大相同前后缀为‘ab’,next[6]=3;
S[7]之前有‘abcaba’,最大相同前后缀为‘a’,next[7]=2;
S[8]之前有‘abcabaa’,最大相同前后缀为‘a’,next[8]=2;
所以next数组为:01112322
这种方法实际上是把next求解的算法抽象出来,放到实际的例子中去了
即:看每个元素之前的序列,若为空,则next=0
否则next=最大相同前后缀长度+1(无相同的话认为是0+1)
这种方法应该是很适合去考试的。
解法2:人肉计算机
这个方法就是纯按照循环走,只是省略了循环中的一些多余步骤,直接对关键点进行判断。
next[1]=0;
int i=1;
int j=0;
while(i<T[0])
{
if(j==0||T[i]==T[j])
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
即仍对S=‘abcabaac’这个字符串
next[1]=0,next[2]=1,这两点是第一次循环后就知道的。
求next[3]时,看前一位的next值即next[2]=1,对应串下标S[1]=‘a’,与S[2]='b’不同,且此时已经比较到第一个元素,所以next[3]=next[2]=1
求next[4]时,前一位的next值为1,对应S[1]=‘a’,与S[3]='c’不同,且已经到第一个元素,next[4]=next[3]=1;
求next[5]时,前一位next值为1,对应S[1]=‘a’,与S[4]='a’相同,所以next[5]=next[4]+1=2;
求next[6]时,前一位next值为2,对应S[2]=‘b’,与S[5]='b’相同,所以next[6]=next[5]+1=3;
求next[7]时,前一位next值为3,对应S[3]=‘c’,与S[6]='a’不同,再看next[3]=1,对应S[1]=‘a’,与S[6]='a’相同,则next[7]=next[3]+1=2;
求next[8]时,前一位next值为2,对应S[2]=‘b’,与S[7]='a’不同,再看next[2]=1
S[1]与S[7]相同,所以next[8]=next[2]+1=2;
所以next数组为01112322
咳咳,回归题目
next数组应该为 0123
2.串中任意多个连续字符组成的子序列称为该串的子串。( √ )
定义内容,需要记忆
3.串是一种数据对象和操作都特殊的线性表。( √ )
串的数据对象被限定为字符集
串的操作大多数为把串当作整体的操作
4.在进行字符初始化时,char s[] = {’H’,’e’,’l’,’l’,’o’,’!’}是合法的。( √ )
C语言的基础语法,可以省略大小
但要注意:字符数组的末尾会缺省添加’\0’的空字符的,即数组长度会+1
但在数据结构中,我们所说的串长度只是字符的数目!
5.数组是同类型值的集合。( X )
这道题因为题意不太明确有两种解释,但都说明这句话是错的
1.数组的逻辑结构是线性结构而不是集合
2.在其他语言中(js),数组并不一定只包含同类型的值
6.模式串T= ‘abcaabbcabcaabdab’ , T的next数组值及nextval数组值为(C) A.01112231123456712和01100111011001702
B.01112121124567112和01102131011021701
C.01112231123456712和01102131011021701
D. 01112121124567112和01100111011001702
借这道题来回忆一下nextval的求解方法
解法一:next衍生法(自己起的名字…说出去大家可能不会知道…但容易记…)
描述:第 i 个字符 (i 的下标从 1开始)若与 第next[i] 上的字符不同,nextval[i]=next[i] ,否则 nextval[i]=next[i]对应元素上的nextval值(也就是 nextval[next[i]])。//第一位的nextval=0
概括一下就是:
不同则衍生(next衍生为nextval),
相同则抄袭(直接把nextval[next[i]]拿来给自己用)
举一个栗子!
还是前面的S=‘abcabaac’这个字符串
next数组为0 1 1 1 2 3 2 2
已知nextval[1]=0
求nextval[2],next[2]=1,对应‘a’与’b’不同,nextval[2]=next[2]=1;
求nextval[3],next[3]=1,对应’a’与’c’不同,nextval[3]=next[3]=1;
求nextval[4],next[4]=1,对应’a’与’a’相同,那么nextval[4]=nextval[1]=0;
求nextval[5],next[5]=2,对应‘b’与‘b’相同,那么nextval[5]=nextval[2]=1;
求nextval[6],next[6]=3,对应‘c’与‘a’不同,那么nextval[6]=next[6]=3;
求nextval[7],next[7]=2,对应’b’与’a’不同,那么nextval[7]=next[7]=2;
求nextval[8],next[8]=2,对应’b’与‘c’不同,那么nextval[8]=next[8]=2;
所以nextval数组为:0 1 1 0 1 3 2 2
解法二:人肉计算机法(没错,只要记住算法,大脑循环,一定可以的!)
int i=1;
int j=0;
nextval[1]=0;
while(i<T[0])
{
if(j==0||T[i]==T[j])
{
i++;
j++;
if(T[i]!=T[j])
{
nextval[i]=j;
}
else
nextval[i]=nextval[j];
}
else
j=nextval[j];
}
7.若某串的长度小于一个常数,则采用(C)存储方式更为节省空间。
A.链式
B.堆结构
C.顺序
答案选C是毫无疑问的,但我们要注意到题目可能会把顺序存储和堆分配分开
8.在长度为n的字符串S的第i个位置插入另外一个字符串,i的合法值应该是(C )
A.i >0
B.i ≤n
C.1≤ i ≤n
D.1≤ i ≤n+1
这道题完全可以排除掉ABD嘛…但为什么选C,我我我…不太清楚…
插眼等dalao
可能插入的是空串?????
9.设 S 为一个长度为 n 的字符串,其中的字符各不相 同,则 S 中的互异的非平凡子串(非空且不同于 S 本 身)的个数为( C )。
A。2^(n-1) B。n(n+1)/2 C.n(n+1)/2-1 D.n(n-1)/2-1
推导一下即可
对于长度为n的串,其非平凡子串有n+n-1+n-2+…+1个
即n(n+1)/2个
又因为不能等于S本身
所以共有n(n+1)/2-1个
10.字符串‘ababaabab’ 的 nextval 为( )
A.(0,1,0,1,0,4,1,0,1)
B.(0,1,0,1,0,2,1,0,1)
C.(0,1,0,1,0,0,0,1,1)
D.(0,1,0,1,0,1,0,1,1)
ababaabab的next数组为:0 1 1 2 3 4 2 3 4
nextval根据第6题我给出的方法为:0 1 0 1 0 4 1 0 1
11.若串 S1=‘ABCDEFG’ , S2=‘9898’ ,S3=‘###’ ,S4= ‘012345’ ,执行 concat(replace(S1,substr(S1,length(S2),length( S3)),S3),substr(S4,index(S2, ‘8’),length(S2))) 其结果为( E )
A:ABC###G0123
B:ABCD###2345
C:ABC###G2345
D:ABC###2345
E:ABC###G1234
F:ABCD###1234
G:ABC###01234
一步步分析嘛
substr(S1,length(S2),length( S3))是S1从第4个元素开始的长度为3的子串‘DEF’
replace(S1,‘DEF’,S3) 是把S1中‘DEF’变为’###’
substr(S4,index(S2, ‘8’),length(S2))是S4从第二个元素开始的长度为4的子串‘1234’
concat(‘ABC###G’,‘1234’)是把两字串连接
所以答案为ABC###G1234
12.知识点补充
如果说块链中结点的大小为4,那么就说明他可以存放4个字符。
空格串是由若干空格字符组成的,空串是没有字符的串。
串的长度是指串中字符的个数。
13.在进行字符初始化时,char s[6]=”Hello!”是合法的。( X )
需要给\0一个位置哦
可以动手试一下,会有下面这样的报错 (mingw64)
error: initializer-string for array of chars is too long [-fpermissive]|
14.KMP算法的特点是在模式匹配时指示主串的指针不会变小。 (√ )
KMP算法的优势就是主串指针不需要回溯。
15.设模式串的长度为m,目标串的长度为n,当n≈m且处理只匹配一次的模式时,朴素的匹配(即子串定位函数)算法所花的时间代价可能会更为节省(√)
算法的使用都是要考虑情况的
这里只匹配一次…next数组计算还是很麻烦的
所以普通的匹配算法可能会更高效
16.在进行字符初始化时,char s[] = {’H’,’e’,’l’,’l’,’o’,’!’}是合法的。 ( √ )