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

admin2017-11-28  27

问题 阅读下列说明和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代码,分析出KMP算法的时间复杂度为(5)  (主串和子串的长度分别为1t和1s,用O符号表示)。

选项

答案 (5)O(1t+1s)

解析 在kmp函数中,只有一个while循环,该算法的时间复杂度为O(1t+1s)。
转载请注明原文地址:https://kaotiyun.com/show/tKDZ777K
0

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