复习—串の习题

对客观题进行了摘选~~~

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’,’!’}是合法的。 ( √ )


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值