试题详情

试题内容

阅读下列说明和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=-l或者t[i]=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:长度为悯铂Is的字符串
next:next数组,长度为Is
(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(i < ls){/*还有字符*/
if(j==-1l ls[i]==s[j]){/*匹配*/
j++;
i++;
if( s[i]==s[j])
next[i] = next[j];
else
Next[i] = j;

}
else
j = next[j];
}
}
int kmp( int *next, char *t ,char *s, int lt, int Is )
{
Int i= 0,j =0
while (i < lt && (1) ) {
if( j==-1 ||     (2)  )  {
i ++
j ++
} else
(3)
}
if (j >= ls)
return     (4)    else
return -1;
}
【问题1】(8分)
根据题干说明,填充C代码中的空(1)~(4)。
【问题2】(2分)
根据题干说明和C代码,分析出kmp算法的时间复杂度为(5)(主串和子串的长度分别为It和Is,用O符号表示)。
【问题3】(5分)
根据C代码,字符串“BBABBCAC”的next数组元素值为(6)(直接写素值,之间用逗号隔开)。若主串为“AABBCBBABBCACCD”,子串为“BBABBCAC”,则函数Kmp的返回值是(7)。
查看答案

软题库参考答案:暂时没有答案(仅供参考)

软题库解析:正在加载....

你可能感兴趣的试题

2题:

阅读下列说明和算法,回答问题1和问题2,将解答填入答题纸的对应栏内。
[说明]
算法2-1是用来检查文本文件中的圆括号是否匹配。若文件中存在圆括号没有对应的左括号或者右括号,则给出相应的提示信息,如下所示:
文件    提示信息
(1+2)
abc)                            缺少对应左括号:第2行,第4列
((def)8x))                            缺少对应左括号:第3行,第10列
(((h)
ij)(k
(1ml)                 &nb
3题:

试题三
阅读下列说明和UML图,回答问题1至问题4。
[说明]
某企业为了方便员工用餐,为餐厅开发了一个订餐系统(COS:Cafeteria Ordering System),企业员工可通过企业内联网使用该系统。
企业的任何员工都可以查看菜单和今日特价。
系统的顾客是注册到系统的员工,可以订餐(如果未登录,需先登录)、注册工资支付、预约规律的订餐,在特殊情况下可以覆盖预订。
餐厅员工是特殊顾客,可以进行备餐、生成付费请求和请求送餐,其中对于注册工资支付的顾客生成付费请求并发送给工资系统。
菜单管理员是餐厅特定员工,可以管理菜单。
送餐员可以打印送餐说明,记录送餐信息(如送餐时间)以及记录收费(对于没有注册工资支付的顾客,由送餐员收取现金后记录)。
顾客订餐过程如下:
1.顾客请求查看菜单:
2.系统显示菜单和今日特价;
3.顾客选菜;
4.系统显示订单和价格;
5.顾客确认订单;
6.系统显示可送餐时间;
7.顾客指定送
5题:阅读下列说明和C++代码,将应填入 (n) 处的字句写在答题纸的对应栏内。
【说明】
某灯具厂商欲生产一个灯具遥控器,该遥控器具有7个可编程的插槽,每个插槽都有开关按钮,对应着一个不同的灯。利用该遥控器能够统一控制房间中该厂商所有品牌灯具的开关,现采用Command(命令)模式实现该遥控器的软件部分。Command模式的类图如图1-1所示。

【C++代码】
class Light {
public:
Light(string name) { /* 代码省略 */ }
void on() { /* 代码省略 */ }    // 开灯
void off() { /* 代码省略 */ }  // 关灯
};
class Command {
public:
6题:

试题六
11、[程序6]
#include<ioStream.h>
template<class T>class Array;
template<class T>class ArrayBody{
friend  (1)  ;
T* tpBody;
int iRows,iCurrentRow;
ArrayBOdy(int iRsz,int iCsz){
tpBody=  (2)  ;
iRows=iRsz,iColumns=iCsz;iCurrentRow=-1;
}
public:
T& operator[](int j) {
bool row_error,column_error;
row_error=column_error=false;
try{
if(iCurrentRow<0||iCurrentRow≥iRows)
row_error=;
4题:阅读下列说明和C代码,回答问题 1 至问题 3,将解答写在答题纸的对应栏内。
【说明】
假币问题:有n枚硬币,其中有一枚是假币,己知假币的重量较轻。现只有一个天平,要求用尽量少的比较次数找出这枚假币。
【分析问题】
将n枚硬币分成相等的两部分:
(1)当n为偶数时,将前后两部分,即 1...n/2和n/2+1...0,放在天平的两端,较轻的一端里有假币,继续在较轻的这部分硬币中用同样的方法找出假币:
(2)当n为奇数时,将前后两部分,即1..(n -1)/2和(n+1)/2+1...0,放在天平的两端,较轻的一端里有假币,继续在较轻的这部分硬币中用同样的方法找出假币;若两端重量相等,则中间的硬币,即第 (n+1)/2枚硬币是假币。
【C代码】
下面是算法的C语言实现,其中:
coins[]: 硬币数组
first,last:当前考虑的硬币数组中的第一个和最后一个下标

#include

int getCounterfeitCoin(int coi
2题:试题二(共15分)
阅读下列说明和图,回答问题1至问愿3,将解答填入答题纸的对应栏内。
【说明】
某营销公司为了便于对各地的分公司及专卖店进行管理,拟开发一套业务管理系统,请根据下述需求描述完成该系统的数据库设计。
【需求描述】
(1) 分公司信息包括:分公司编号、分公司名、地址和电话。其中,分公司编号唯一确定分公司关系的每一个元组。每个分公司拥有多家专卖店,每家专卖店只属于一个分公司。
(2) 专卖店信息包括:专卖店号、专卖店名、店长、分公司编号、地址、电话,其中店号唯一确定专卖店关系中的每一个元组。每家专卖店只有一名店长,负责专卖店的各项业务:每名店长只负责一家专卖店:每家专卖店有多名职员,每名职员只属于一家专卖店。
(3)职员信息包括:职员号、职员名、专卖店号、岗位、电话、薪资。其中,职员号唯一标识职员关系中的每一个元组。岗位有店长、营业员等。
【概念模型设计】
根据需求阶段收集的信息,设计的实体联系图(不完整)如图2-1所示。