第四章 串
- 格式:doc
- 大小:47.01 KB
- 文档页数:5
《数据结构与算法》第四章串知识点及例题精选串(即字符串)是一种特殊的线性表,它的数据元素仅由一个字符组成。
4.1 串及其基本运算4.1.1 串的基本概念1.串的定义串是由零个或多个任意字符组成的字符序列。
一般记作:s="s1 s2 … s n""其中s 是串名;在本书中,用双引号作为串的定界符,引号引起来的字符序列为串值,引号本身不属于串的内容;a i(1<=i<=n)是一个任意字符,它称为串的元素,是构成串的基本单位,i是它在整个串中的序号; n为串的长度,表示串中所包含的字符个数,当n=0时,称为空串,通常记为Ф。
2.几个术语子串与主串:串中任意连续的字符组成的子序列称为该串的子串。
包含子串的串相应地称为主串。
子串的位置:子串的第一个字符在主串中的序号称为子串的位置。
串相等:称两个串是相等的,是指两个串的长度相等且对应字符都相等。
4.2 串的定长顺序存储及基本运算因为串是数据元素类型为字符型的线性表,所以线性表的存储方式仍适用于串,也因为字符的特殊性和字符串经常作为一个整体来处理的特点,串在存储时还有一些与一般线性表不同之处。
4.2.1 串的定长顺序存储类似于顺序表,用一组地址连续的存储单元存储串值中的字符序列,所谓定长是指按预定义的大小,为每一个串变量分配一个固定长度的存储区,如:#define MAXSIZE 256char s[MAXSIZE];则串的最大长度不能超过256。
如何标识实际长度?1. 类似顺序表,用一个指针来指向最后一个字符,这样表示的串描述如下:typedef struct{ char data[MAXSIZE];int curlen;} SeqString;定义一个串变量:SeqString s;这种存储方式可以直接得到串的长度:s.curlen+1。
如图4.1所示。
s.dataMAXSIZE-1图4.1 串的顺序存储方式12. 在串尾存储一个不会在串中出现的特殊字符作为串的终结符,以此表示串的结尾。
习题四串一、单项选择题1.下面关于串的的叙述中,哪一个是不正确的?()A.串是字符的有限序列 B.空串是由空格构成的串C.模式匹配是串的一种重要运算 D.串既可以采用顺序存储,也可以采用链式存储2.串是一种特殊的线性表,其特殊性体现在()。
A.可以顺序存储 B.数据元素是一个字符C.可以链接存储 D.数据元素可以是多个字符3.串的长度是指()A.串中所含不同字母的个数 B.串中所含字符的个数C.串中所含不同字符的个数 D.串中所含非空格字符的个数4.设有两个串p和q,其中q是p的子串,求q在p中首次出现的位置的算法称为()A.求子串 B.联接 C.匹配 D.求串长5.若串S=“softwa re”,其子串的个数是()。
A.8 B.37 C.36 D.9二、填空题1.含零个字符的串称为______串。
任何串中所含______的个数称为该串的长度。
2.空格串是指__ __,其长度等于__ __。
3.当且仅当两个串的______相等并且各个对应位置上的字符都______时,这两个串相等。
一个串中任意个连续字符组成的序列称为该串的______串,该串称为它所有子串的______串。
4.INDEX(‘DATAST RUCTU RE’,‘STR’)=________。
5.模式串P=‘abaabc ac’的next函数值序列为________。
6.下列程序判断字符串s是否对称,对称则返回1,否则返回0;如 f("abba")返回1,f("abab")返回0;int f((1)__ ______){int i=0,j=0;while(s[j])(2)___ _____;for(j--; i<j && s[i]==s[j]; i++,j--);return((3)___ ____)}7.下列算法实现求采用顺序结构存储的串s和串t的一个最长公共子串。
第四章串一、选择题
1.下列有关字符串的描述,正确的是()
A.字符串是0个或多个字符构成的有限序列;
B.字符串是0个或多个字母不同的有限序列;
C.字符串中最少要有一个子符;
D.字符串中不能有空格字符。
2. 字符串S="string"中,包含的子串的个数是()
A. 20
B. 21
C. 22
D. 23
3.目标串为T="this is a string",模式串P="string",进行模式匹配,有效位移是()(起始位置为0)。
A. 9
B. 10
C. 11
D. 12
4.已知串S= "string",T="this",执行运算strlen(strcopy(S,T))的结果是()
A. 4
B. 6
C. 10
D. 2
5.目标串为T="this is a string",模式串P="string",进行模式匹配,所有的无效位移数是()
A. 6
B. 10
C. 16
D. 11
6.下列命题正确的是()
A. 空串就是空白串;
B. 空串不是串;
C. 空串是长度为0的字符串
D. 串相等指的是长度相等
7.若字符串采用链式存储,每个字符占用一个字节,每个指针在占用四个字节,则该字符串的存储密度为()
A. 50%
B. 25%
C. 75%
D. 20%
8.当目标串的长度为n,模式串的长度为m时,朴素的模式匹配算法最坏情况下字符的比较次数()
A . n B. n*m C. (n-m+1)*m D. m
9.当目,模式串的长度为m时,朴素的模式匹配算法最好情况下字符的比较次数()
A. n
B. m
C. n+m D n-m
10.字符串是一种特殊的线性表,它与一般线性表的区别是()
A.字符串是一种线性结构;
B.字符串可以进行复制操作;
C.字符串由字符构成并且通常作为整体参与操作;
D.字符串可以顺序存储也可以链式存储。
11.下所述中正确的是()
A.串是一种特殊的线性表 B.串的长度必须大于零
C.串中元素只能是字母 D.空串就是空白串
12.若目标串的长度为n,模式串的长度为[n/3],则执行模式匹配算法时,在最坏情况下的时间复杂度是()
A.O(n/3) B.O(n) C.O(n2) D.O(n3)
13.设有两个串T和P,求P在T中首次出现的位置的串运算称作()
A.联接 B.求子串 C.字符定
位 D.子串定位
14.为查找某一特定单词在文本中出现的位置,可应用的串运算是()
A.插入 B.删除 C.串联
接 D.子串定位
15.已知函数Sub(s,i,j)的功能是返回串s中从第i个字符起长度为j的子串,函数Scopy(s,t)的功能为复制串t到s。
若字符串S="SCIENCESTUDY",则调用函数Scopy(P,Sub(S,1,7))后得到( )
A.P="SCIENCE" B.P="STUDY" C.S="SCIENCE"
D.S="STUDY"
二、填空题
1.空串的长度为,空格串(空白串)的长度为。
2.子串的定位运算又称为,通常把主串又称为子串又称为。
3.成功匹配的起始位置称为,匹配失败的起始位置称为。
4.设目标串为T="abccdadeef",模式串P="ade",则第趟匹配成功。
5.已知串T="abccdadeef",P="abccyde",函数strcmp(T,P)的运算结果是。
6.串朴素的模式匹配算法在顺序串和链串上运行,时间复杂度。
7.已知串T="abccdadeef",T中包含以b打头的子串有个。
8.通常在程序设计中,串分为和。
9.按存储结构通常分为和。
10.设s1="GOOD",s2="" ,s3="BYE!",则s1,s2,和s3连接后的结果
是。
三.阅读程序题
1.指出程序功能
int stringcmp(Hstring S,Hstring T)
{int i=0,tag=1;
if (S.length!=T.length) tag=0;
else
while(i<S.length&&tag)
if (S.ch[i]==T.ch[i]) i++;
else tag=0;
return tag;
}
2.阅读程序
int stringpatindex (Hstring S,Hstring T)
{int i,j,k;
for(i=0;i<S.length;i++)
{for(j=i,k=0;k<T.length;j++,k++)
if(S.ch[j]!=T.ch[k]&&|T[k]!='?')
break;
if(k>=T.length) return i;
}
return –1;
}
(1)指出程序功能;
(2)设S中存储"there are a string",T中存储"??r"函数的返回值是什么?3.阅读程序指出程序功能
void restring(Hstring S)
{char *p,*q,c;
p=S.ch;q=S.ch+S.length-1;
while(p<q)
{c=*p;*p=*q;*q=c;
p++;q--;
}
}
4.下列算法的功能是比较两个链串的大小,其返回值为:
-1 s1<s2
comstr(s1,s2)= 0 s1=s2
1 s1>s2
请在空白处填入适当的内容。
〖2001〗
int comstr(linkstring s1,linkstring s2)
{//s1和s2为两个链串的头指针
while(s1&&s2) {
if(s1->data<s2->data) return –1;
if(s1->data>s2->data) return 1;
①;
②;
}
if( ③ ) return –1;
if( ④ ) return 1;
⑤ ;
}
四、算法设计题
1.利用C的库函数strlen,strcpy和strcat写一个算法void strinsert(char *S,char *T,int i),将串T插入到串S的第i个位置上。
若i大于S的长度,则插入不执行。
2.利用C的库函数strlen,strcpy和strcat写一个算法void strdelete(char *S,int i,int m),删去串S中从第i个字符开始的连续m个字符。
若i≥strlen(S),则没有字符被删除,若i+m≥strlen(S),。
则将串S中从第i个字符开始直到末尾的字符删去。
tring 为存储表示,写一个求子串的算法。
3.一个文本串可用事先给定的字符映像表进行加密。
例如,设字符映像表为:
abcdefghijklmnopqrstuvwxyz
ngzqtcobmuhelkpdawxfyivrsj
则字符串"encrypt"被加密为"tkzwsdf"。
试写一算法将输入的文本串进行加密后输出;另写一算法将输入的已加密的文本串进行解密后输出。
4.写一算法void strreplace(char *T,char *P,char *S),将T中首次出现的子串P替换为串S。
注意S和T的长度不一定相等。
可以使用已有的串操作。
5.将NaiveStrMatch(T,P)改写为输出目标串中所有与模式串匹配的有效位移。
}
6.写一算法void strreplaceall(char *T,char *P,char *S),将T中出现的所有与P相等的不重叠子串替换S,这里S和P的长度不一定相等。
7.若S和T是用结点大小为1的单链表存储的两个串,是设计一个算法找出S中第一个不在T 中出现的字符。
8.编写算法实现两个串的连接。
9.设计算法删除主串中所有指定子串。
10.编写算法判断串是否为回文。