数据结构练习第四章 串Word文档下载推荐.docx
- 文档编号:19785101
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:15
- 大小:40.30KB
数据结构练习第四章 串Word文档下载推荐.docx
《数据结构练习第四章 串Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构练习第四章 串Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
3.空格串是指_______,其长度等于_______。
(1)由空格字符(ASCII值32)所组成的字符串
(2)空格个数
4.一个字符串中________称为该串的子串。
任意个连续的字符组成的子序列
5.字符串’ababaaab’的nextval函数值为________。
01010421
6.串是一种特殊的线性表,其特殊性表现在__
(1)__;
串的两种最基本的存储方式是__
(2)__、__(3)__;
两个串相等的充分必要条件是__(4)__。
(1)其数据元素都是字符
(2)顺序存储
(3)和链式存储
(4)串的长度相等且两串中对应位置的字符也相等
7.下列程序读入无符号16进制数(出现的字母为小写),将其转换为十进制数输出。
请将程序空缺部分补全。
intf(char*s)
{intn=0,i;
for(i=0;
s[i]!
=’\0’;
i++)n=n*16+
(1);
returnn;
}
main()
{chars[10];
scanf(“%s”,s);
printf(“%d\n”,
(2));
(1)(s[i]>
=97?
s[i]-87:
s[i]-48)∥‘a’到’f’的ASCII码是97到102
(2)f(s)
8.下列算法实现求采用顺序结构存储的串s和串t的一个最长公共子串。
voidmaxcomstr(orderstring*s,*t,intindex,length)
{inti,j,k,length1,con;
index=0;
length=0;
i=1;
while(i<
=s.len)
{j=1;
while(j<
=t.len)
{if(s[i]==t[j])
{k=1;
length1=1;
con=1;
while(con)
if
(1)_{length1=length1+1;
k=k+1;
}else
(2)__;
if(length1>
length){index=i;
length=length1;
}
(3)____;
else(4)___;
(5)__
}}
[题目分析]本题算法采用顺序存储结构求串s和串t的最大公共子串。
串s用i指针(1<
=i<
=s.len)。
t串用j指针(1<
=j<
=t.len)。
算法思想是对每个i(1<
=s.len,即程序中第一个while循环),来求从i开始的连续字符串与从j(1<
=t.len,即程序中第二个while循环)开始的连续字符串的最大匹配。
程序中第三个(即最内层)的while循环,是当s中某字符(s[i])与t中某字符(t[j])相等时,求出局部公共子串。
若该子串长度大于已求出的最长公共子串(初始为0),则最长公共子串的长度要修改。
(1)i+k<
=s.len&
&
j+k<
=t.len&
s[i+k]==t[j+k]
∥如果在s和t的长度内,对应字符相等,则指针k后移(加1)
(2)con=0∥s和t对应字符不等时置标记退出
(3)j=j+k∥在t串中,从第j+k字符再与s[i]比较
(4)j=j+1∥t串取下一字符
(5)i=i+1∥s串指针i后移(加1)。
9.试利用下列栈和串的基本操作完成下述填空题。
initstack(s)置s为空栈;
push(s,x)元素x入栈;
pop(s)出栈操作;
gettop(s)返回栈顶元素;
sempty(s)判栈空函数;
setnull(st)置串st为空串;
length(st)返回串st的长度;
equal(s1,s2)判串s1和s2是否相等的函数;
concat(s1,s2)返回联接s1和s2之后的串;
sub(s,i,1)返回s中第i个字符;
empty(st)判串空函数
FUNCinvert(pre:
string;
VARexp:
string):
boolean;
{若给定的表达式的前缀式pre正确,本过程求得和它相应的表达式exp并返回“true”,否则exp为空串,并返回“false”。
已知原表达式中不包含括弧,opset为运算符的集合。
}
VARs:
stack;
i,n:
integer;
succ:
ch:
char;
BEGIN
i:
=1;
n:
=length(pre);
=true;
(1)__;
(2)__;
WHILE(i<
n)ANDsuccDO
BEGINch:
=sub(pre,i,l);
IF(3)_THEN(4)__
ELSEIF(5)__THEN(6)_
ELSEBEGIN
exp:
=concat((7)___,(8)____);
=concat((9)___,(10)___);
(11)__;
END;
=i+1
IF(12)___THEN
BEGINexp:
=concat(exp,sub(pre,n,1));
invert:
=trueEND
ELSEBEGINsetnull(exp);
=falseEND
注意:
每个空格只填一个语句。
(1)initstack(s)∥栈s初始化为空栈
(2)setnull(exp)∥串exp初始化为空串
(3)chinopset∥判取出字符是否是操作符
(4)push(s,ch)∥如ch是运算符,则入运算符栈s
(5)sempty(s)∥判栈s是否为空
(6)succ:
=false∥若读出ch是操作数且栈为空,则按出错处理
(7)exp
(8)ch∥若ch是操作数且栈非空,则形成部分中缀表达式
(9)exp
(10)gettop(s)∥取栈顶操作符
(11)pop(s)∥操作符取出后,退栈
(12)sempty(s) ∥将pre的最后一个字符(操作数)加入到中缀式exp的最后
三、判断题
1.()子串“ABC”在主串“AABCABCD”中的位置为2。
T
2.()KMP算法的特点是在模式匹配时指示主串的指针不会变小。
√
3.()设模式串的长度为m,目标串的长度为n,当n≈m且处理只匹配一次的模式时,朴素的匹配(即子串定位函数)算法所花的时间代价可能会更为节省。
4.()串是一种数据对象和操作都特殊的线性表。
5.()串长度是指串中不同字符的个数。
×
6.()如果两个串含有相同的字符,则这两个串相等。
X
7.()KMP算法的最大特点是指示主串的指针不回溯。
四、简答题
1.KMP算法(字符串匹配算法)较Brute(朴素的字符串匹配)算法有哪些改进?
朴素的模式匹配(Brute-Force)时间复杂度是O(m*n),KMP算法有一定改进,时间复杂度达到O(m+n)。
主要优点是主串指针不回溯。
当主串很大不能一次读入内存且经常发生部分匹配时,KMP算法的优点更为突出。
2.给出字符串‘abacabaaad’在KMP算法中的next和nextval数组。
模式串的next函数定义如下:
根据此定义,可求解模式串’abacabaaad’的next和nextval值如下:
j
12345678910
t串
abacabaaad
next[j]
0112123422
nextval[j]
0102010422
3.模式匹配算法是在主串中快速寻找模式的一种有效的方法,如果设主串的长度为m,模式的长度为n,则在主串中寻找模式的KMP算法的时间复杂性是多少?
如果,某一模式P=’abcaacabaca’,请给出它的NEXT函数值及NEXT函数的修正值NEXTVAL之值。
KMP算法的时间复杂性是O(m+n)。
p的next和nextval值分别为01112212321和01102201320。
4.设目标为S=‘abcaabbcaaabababaabca’,模式为P=‘babab’。
(1)手工计算模式P的nextval数组的值;
(2)写出利用求得的nextval数组,按KMP算法对目标S进行模式匹配的过程。
(1)p的nextval函数值为01010。
(next函数值为01123)
(2)利用所得nextval数值,手工模拟对s的匹配过程。
5.s是字符数组,s[0]中存放的是该字符串的有效长度,假设s[1..7]中字符串的内容为“abcabaa”,说明下列程序的功能及执行结果。
#definelen8
intk,n[len];
chars[len]=“7abcabaa”;
voidunknown3(charT[])
{inti,j;
n[1]=0;
j=0;
while(i<
len)
{if(j==0||T[i]==T[j])
{++i;
++j;
if(T[i]!
=T[j])n[i]=j;
elsen[i]=n[j];
elsej=n[j];
{unknown3(s);
for(k=1;
k<
len;
k++)printf(“%d”,n[k];
)
本程序的功能是求字符串的nextval函数,程序执行结果是0110132。
6.给出KMP算法中失败函数f的定义,并说明利用f进行串模式匹配的规则,该算法的技术特点是什么?
这里失败函数f,即是通常讲的模式串的next函数,其定义见本章应用题的第5题。
进行模式匹配时,若主串第i个字符与模式串第j个字符发生失配,主串指针i不回溯,和主串第i个字符进行比较的是模式串的第next[j]个字符。
模式串的next函数值,只依赖于模式串,和主串无关,可以预先求出。
该算法的技术特点是主串指针i不回溯。
在经常发生“部分匹配”和主串很大不能一次调入内存时,优点特别突出。
7.已知:
s='
(xyz)+*'
,t='
(x+z)*y'
。
试利用联结、求子串和置换等基本运算,将s转化为t。
【北方交通大学1996一.3(5分)】
题中所给操作的含义如下:
∥:
连接函数,将两个串连接成一个串
substr(s,i,j):
取子串函数,从串s的第i个字符开始,取连续j个字符形成子串
replace(s1,i,j,s2):
置换函数,用s2串替换s1串中从第i个字符开始的连续j个字符
本题有多种解法,下面是其中的一种:
(1)s1=substr(s,3,1)∥取出字符:
‘y’
(2)s2=substr(s,6,1)∥取出字符:
‘+’
(3)s3=substr(s,1,5)∥取出子串:
‘(xyz)’
(4)s4=substr(s,7,1)∥取出字符:
‘*’
(5)s5=replace(s3,3,1,s2)∥形成部分串:
‘(x+z)’
(6)s=s5∥s4∥s1∥形成串t即‘(x+z)*y’
8.已知模式串pat=’ADABBADADA’,写出该模式串的next函数值和nextval值;
(4分)
五、应用题
模式串t=’abaabc’,求t的next函数值。
j
123456
模式串
abaabc
【解答】
011223
评分标准:
全题4分,错误酌情扣分
六、算法设计题
1.设计在顺序存储结构上实现求子串算法。
voidsubstring(chars[],longstart,longcount,chart[])
{
longi,j,length=strlen(s);
if(start<
1||start>
length)printf("
Thecopypositioniswrong"
);
elseif(start+count-1>
Toocharacterstobecopied"
else{for(i=start-1,j=0;
i<
start+count-1;
i++,j++)t[j]=s[i];
t[j]='
\0'
;
2.设s、t为两个字符串,分别放在两个一维数组中,m、n分别为其长度,判断t是否为s的子串。
如果是,输出子串所在位置(第一个字符),否则输出0。
(注:
用程序实现)
【中科院研究生院2003九(15分)】【南京航空航天大学1997九(10分)】
[题目分析]判断字符串t是否是字符串s的子串,称为串的模式匹配,其基本思想是对串s和t各设一个指针i和j,i的值域是0..m-n,j的值域是0..n-1。
初始值i和j均为0。
模式匹配从s0和t0开始,若s0=t0,则i和j指针增加1,若在某个位置si!
=tj,则主串指针i回溯到i=i-j+1,j仍从0开始,进行下一轮的比较,直到匹配成功(j>
n-1),返回子串在主串的位置(i-j)。
否则,当i>
m-n则为匹配失败。
intindex(chars[],t[],intm,n)
∥字符串s和t用一维数组存储,其长度分别为m和n
∥本算法求字符串t在字符串s中的第一次出现,匹配成功输出t串在s中的位置,否则输出0
{inti=0,j=0;
while(i<
=m-n&
j<
=n-1)
if(s[i]==t[j]){i++;
j++;
}∥对应字符相等,指针后移
else{i=i-j+1;
j=0;
}∥对应字符不相等,i回溯,j仍为0
if(i<
j==n){printf(“t在s串中位置是%d”,i-n+1);
return(i-n+1);
}∥匹配成功
elsereturn(0);
∥匹配失败
}∥算法index结束
main()∥主函数
{chars[],t[];
intm,n,i;
scanf(“%d%d”,&
m,&
n);
∥输入两字符串的长度
scanf(“%s”,s);
∥输入主串
scanf(“%s”,t);
∥输入子串
i=index(s,t,m,n);
}∥程序结束
[程序讨论]因用C语言实现,一维数组的下标从0开始,m-1是主串最后一个字符的下标,n-1是t串的最后一个字符的下标。
若匹配成功,最佳情况是s串下标0到n-1的字符与t匹配,时间复杂度为O(n);
匹配成功的最差情况是,每次均在t的最后一个字符才失败,直到s串的下标为m-n时成功,其时间复杂度为O((m-n)*n),即O(m*n)。
失败的情况是s串的第m-n个字符比t串某字符比较失败,时间复杂度为O(m*n)。
之所以串s的指针i最大到m-n,是因为在m-n之后,所剩串的长度已经小于子串长度n,故不必再去比较。
算法中未讨论输入错误(如s串长度小于t串长度)。
另外,根据子串的定义,返回值i-n+1是子串在主串中的位置,子串在主串中的下标是i-n。
3.以顺序存储结构表示串,设计算法。
求串S中出现的第一个最长重复子串及其位置并分析算法的时间复杂度。
【东南大学2000五(15分)】【西北大学2002六(15分)】
[题目分析]设以字符数组s表示串,重复子串的含义是由一个或多个连续相等的字符组成的子串,其长度用max表示,初始长度为0,将每个局部重复子串的长度与max相比,若比max大,则需要更新max,并用index记住其开始位置。
intLongestString(chars[])
∥串用一维数组s存储,本算法求最长重复子串,返回其长度
{intindex=0,max=0;
∥index记最长的串在s串中的开始位置,max记其长度
intlength=1,i=0,start=0;
∥length记局部重复子串长度,i为字符数组下标
while(s[i]!
=’\0’)
if(s[i]==s[i+1]){i++;
length++;
else∥上一个重复子串结束
{if(max<
length){max=length;
index=start;
}∥当前重复子串长度大,则更新max
i++;
start=i;
length=1;
∥初始化下一重复子串的起始位置和长度
printf(“最长重复子串的长度为%d,在串中的位置%d\n”,max,index);
return(max);
}∥算法结束
算法的时间复杂度为O(n),每个字符与其后继比较一次。
4.编写程序,统计在输入字符串中各个不同字符出现的频度并将结果存入文件(字符串中的合法字符为A-Z这26个字母和0-9这10个数字)。
【西北大学2000四(10分)】
[问题分析]由于字母共26个,加上数字符号10个共36个,所以设一长36的整型数组,前10个分量存放数字字符出现的次数,余下存放字母出现的次数。
从字符串中读出数字字符时,字符的ASCII代码值减去数字字符‘0’的ASCII代码值,得出其数值(0..9),字母的ASCII代码值减去字符‘A’的ASCII代码值加上10,存入其数组的对应下标分量中。
遇其它符号不作处理,直至输入字符串结束。
voidCount()
∥统计输入字符串中数字字符和字母字符的个数
{inti,num[36];
charch;
for(i=0;
i<
36;
i++)num[i]=0;
∥初始化
while((ch=getchar())!
=‘#’)∥‘#’表示输入字符串结束
if(ch>
=‘0’&
ch<
=‘9’){i=ch-48;
num[i]++;
}∥数字字符
else if(ch>
=‘A’&
=‘Z’){i=ch-65+10;
}∥字母字符
for(i=0;
10;
i++)∥输出数字字符的个数
printf(“数字%d的个数=%d\n”,i,num[i]);
for(i=10;
i++)∥求出字母字符的个数
printf(“字母字符%c的个数=%d\n”,i+55,num[i]);
}∥算法结束。
5.写出一个递归算法来实现字符串逆序存储。
【中科院研究生院2004四(7分)】
[题目分析]实现字符串的逆置并不难,但本题“要求不另设串存储空间”来实现字符串逆序存储,即第一个输入的字符最后存储,最后输入的字符先存储,使用递归可容易做到。
voidInvertStore(charA[])
∥字符串逆序存储的递归算法
{charch;
staticinti=0;
∥需要使用静态变量
scanf("
%c"
&
ch);
if(ch!
='
.'
)∥规定'
是字符串输入结束标志
{InvertStore(A);
A[i++]=ch;
∥字符串逆序存储
A[i]='
∥字符串结尾标记
}∥结束算法InvertStore
6.S=“S1S2…Sn”是一个长为N的字符串,存放在一个数组中,编程序将S改造之后输出:
(1)将S的所有第偶数个字符按照其原来的下标从大到小的次序放在S的后半部分;
(2)将S的所有第奇数个字符按照其原来的下标从小到大的次序放在S的前半部分;
例如:
S=‘ABCDEFGHIJKL’
则改造后的S为‘ACEGIKLJHFDB’。
【中科院计算所1995】
[题目分析]对读入的字符串的第奇数个字符,直接放在数组前面,对第偶数个字符,先入栈,到读字符串结束,再将栈中字符出栈,送入数组中。
限于篇幅,这里编写算法,未编程序。
voidReArrangeString()
∥对字符串改造,将第偶数个字符放在串的后半部分,第奇数个字符前半部分。
{charch,s[],stk[];
∥s和stk是字符数组(表示字符串)和字符栈
inti=1,j;
∥i和j字符串和字符栈指针
while((ch=getchar())!
=’#’)s[i++]=ch;
∥读入字符串,’#’是字符串结束标志
s[i]=’\0’;
∥字符数组中字符串结束标志
i=1;
j=1;
while(s[i])∥改造字符串
{if(i%2==0)stk[i/2]=s[i];
elses[j++]=s[i];
}∥while
i--;
i=i/2;
∥i先从’\0’后退,然后其含义是第偶数字符的个数
while(i>
0)s[j++]=stk[i--]∥将第偶数个字符逆序填入原字符数组
7.若x和y是两个采用顺序结构存储的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构练习第四章 数据结构 练习 第四
![提示](https://static.bdocx.com/images/bang_tan.gif)