MOOC数据结构 第五周

1.下面关于串的叙述中,正确的是( A)。
A.串是一种特殊的线性表
B.串中元素只能是字母
C.空串就是空白串
D.串的长度必须大于零
2.两个字符串相等的条件是(D )。
A.串的长度相等
B.含有相同的字符集
C.都是非空串
D.两个串的长度相等且对应位置的字符相同
3.若串str=“Software”,其子串的个数是(D )。
A.8
B.9
C.36
D.37
4.一个链串的节点类型定义为
#define NodeSize 6
typedef struct node
{ char data[NodeSize];
struct node next;
} LinkStrNode;
如果每个字符占1个字节,指针占2个字节,该链串的存储密度为( D)。
A.1/3
B.1/2
C.2/3
D.3/4
解析: D、链串节点大小指每个节点存放的字符个数,本题节点大小为6,存储密度=(6
1)/(6*1+2)=3/4。
5.串采用节点大小为1的链表作为其存储结构,是指(C )。
A.链表的长度为1
B.链表中只存放一个字符
C.链表中每个节点的数据域中只存放一个字符
D.以上都不对
6.对于一个链串s,查找第一个字符值为x的算法的时间复杂度为( B)。
A.O(1)
B.O(n)
C.在这里插入图片描述

D.以上都不对
7.设有两个串p和q,其中q是p的子串,则求q在p中首次出现位置的算法称为(C )。
A.求子串
B.串联接
C.模式匹配
D.求串长
8.在串的简单模式匹配中,当模式串位j与目标串位i比较时,两字符不相等,则i的位移方式是(C )。
A.i++
B.i=j+1
C.i=i-j+1
D.i=j-i+1
9.在KMP模式匹配中,用next数组存放模式串的部分匹配信息。当模式串位j与目标串位i比较时,两字符不相等,则i的位移方式是(B )。
A.i=next[j]
B.i不变
C.j不变
D.j=next[j]
10.在KMP模式匹配中,用next数组存放模式串的部分匹配信息。当模式串位j与目标串位i比较时,两字符不相等,则j的位移方式是(D )。
A.i=next[j]
B.i不变
C.j不变
D.j=next[j]
1.设s为一个长度为n的串,其中的字符各不相同,则s中的互异非平凡子串(非空且不同于s本身)的个数是多少?
长度为1的互异的非平凡子串有n个
长度为2的互异的非平凡子串有n-1个
长度为3的互异的非平凡子串有n-2个
长度为n-1的互异的非平凡子串有2个
长度为n的子串是本身,不是互异的非平凡子串。
所以,共有n+(n-1)+(n-2)+…+2 = (n+2)(n-1)/2 = nn/2+n/2-1
2.在KMP算法中,计算模式串的next时,当j=0时,为什么要取next[0]=-1?
说明模式串t[j]之前没有任何用于加速匹配的信息,下一趟应从t的开头即j++,j=0开始匹配。
3.给出以下模式串的next值和nextval值:
(1)ababaa
(2)abaabaab
(1)
|j | 0 |1 | 2 | 3 | 4 | 5 |
|t[j] | a | b | a | b | a | a |
| next[j] | -1 | 0 | 0 | 1 | 2 | 3 |
| nextval[j] | -1 | 0 | -1 | 0 | -1 | 3 |
(2)
|j | 0 |1 | 2 | 3 | 4 | 5 | 6 | 7 |
|t[j] | a | b | a | a | b | a | a | b |
| next[j] | -1 | 0 | 0 | 1 | 1 | 2 | 3 | 4 |
| nextval[j] | -1 | 0 | -1 | 1 | 0 | -1| 1 | 1 |
4.设有一个顺序串s,其字符仅由数字和小写字母组成。设计一个算法将s中所有数字字符放在前半部分,所有小写字母字符放在后半部分。并给出你所设计的算法的时间和空间复杂度。

#include <iostream>
using namespace std;
const int max=100;
typedef struct
{
	char data[100];
	int length;
}SqString;
void f(SqString &s)
{
	int i=0,j=s.length-1;
	while(i<j)
	{
		while(i<j&&s.data[i]>='0'&&s.data[i]<='9')
		i++;
		while(i<j&&s.data[j]>='a'&&s.data[j]<='z')
		j--;
		if(i<j)
		{
			char c;
			c=s.data[i];
			s.data[i]=s.data[j];
			s.data[j]=c;
		}
	}
}
int main()
{
	SqString s={"a2cvr25d4e",10};
	f(s);
	cout<<s.data;
	return 0;
}

O(n)=T(m)
5.用带头节点的单链表表示链串,每个节点存放一个字符。设计一个算法求s中最长平台的长度,所谓平台是指连续相同字符。

#include <iostream>
#include <stdlib.h>
using namespace std;
const int max=100;
typedef struct snode
{
	char data;
	struct snode *next;
}LiString;
void StrAssign(LiString *&s,char cstr[])
{
	int i;
	LiString *r,*p;
	s=(LiString *)malloc(sizeof(LiString));
	r=s;
	for(i=0;cstr[i]!='\0';i++)
	{
		p=(LiString *)malloc(sizeof(LiString));
		p->data=cstr[i];
		p->next=r->next;
		r->next=p;
		r=p;
	}
	r->next=NULL;
}
void DisStr(LiString *s)
{
	LiString *p=s->next;
	while(p!=NULL)
	{
		cout<<p->data<<" ";
		p=p->next;
	}
	cout<<endl;
}
int f(LiString *&s)
{
	LiString *p=s->next;
	int len=1,maxlen=0;
	while(p->next!=NULL)
	{
		if(p->data==p->next->data)
		{
			len++;
			if(len>maxlen)
			maxlen=len;
		}
		else len=1;
		p=p->next;
	}
	return maxlen;
}
int main()
{
	LiString *a;
	char s[]="abcccddddde";
	StrAssign(a,s);
	DisStr(a);
	cout<<f(a);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值