阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。 【说明】 模式匹配是指给定主串t和子串s,在主串t中寻找子串s的过程,其中s称为模式。如果匹配成功,返回s在t中的位置,否则返回一1。 KMP算法用next数组对匹配过程进行了优化。K

admin2017-11-28  29

问题 阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。
【说明】
模式匹配是指给定主串t和子串s,在主串t中寻找子串s的过程,其中s称为模式。如果匹配成功,返回s在t中的位置,否则返回一1。
KMP算法用next数组对匹配过程进行了优化。KMP算法的伪代码描述如下:
1.在串t和串s中,分别设比较的起始下标i=j=0。
2.如果串t和串s都还有字符,则循环执行下列操作:
(1)如果j=1或者t=s[j],则将i和j分别加1;继续比较t和s的下一个字符;
(2)否则,将j向右滑动到next[j]的位置,即j=next[j]。
3.如果s中所有字符均已比较完毕,则返回匹配的起始位置(从1开始);否则返回一1。其中,next数组根据子串s求解。求解next数组的代码已由get next函数给出。
【C代码】
(1)常量和变量说明
t,s:长度为1t和1s的字符串
next:next数组,长度为1s
(2)C程序
#include
#include
#include
/*求next[]的值*/
void get next(int*next,char*s,int is){
int i=0,j=一1;
next[0]=一1;/*初始化next[0]*/
while(iif(j==一1‖s=s[j]){/*匹配*/
j++
i++;
if(s==s[j])
next=next[j];
else
next=j;
}
else
j=next[j];
}
}
int kmp(int*next,Char*t,char*s,int it,int is)
    {
int i=0,j=0;
while(iif(j=一1 ‖ (2) ){
  i  ++;
    j++;
    }  else
    (3) ,
    }
    if  (  j>=ls)
    return    (4);
    else
    return一1;
    }
根据C代码,字符串“BBABBCAC”的next数组元素值为(6)  (直接写元素值,之间用逗号隔开)。若主串为“AABBCBBABBCACCD”,子串为“BBABBCAC”,则函数kmp的返回值是(7)。

选项

答案(6)-1,-1,1,一1,一1,2,0,0(7)6

解析 根据C函数get—next,得到“BBABBCAC"的next数组的值为一1,一1,1,一1,一l,
2,0,0。对主串为“AABBCBBABBCACCD”和上述模式串,得到匹配位置为6,这里需要注意的是,位置从1开始。
转载请注明原文地址:https://kaotiyun.com/show/3KDZ777K
0

相关试题推荐
最新回复(0)