第四章 串
- 格式:pdf
- 大小:320.62 KB
- 文档页数:6
《数据结构与算法》第四章串知识点及例题精选串(即字符串)是一种特殊的线性表,它的数据元素仅由一个字符组成。
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的一个最长公共子串。
第四章答案4.1 简述下列每对术语的区别:空串和空白串;串常量和串变量;主串和子串;静态分配的顺序串和动态分配的顺序串;目标串和模式串;有效位移和无效位移。
答:●空串是指不包含任何字符的串,它的长度为零。
空白串是指包含一个或多个空格的串,空格也是字符。
●串常量是指在程序中只可引用但不可改变其值的串。
串变量是可以在运行中改变其值的。
●主串和子串是相对的,一个串中任意个连续字符组成的串就是这个串的子串,而包含子串的串就称为主串。
●静态分配的顺序串是指串的存储空间是确定的,即串值空间的大小是静态的,在编译时刻就被确定。
动态分配的顺序串是在编译时不分配串值空间,在运行过程中用malloc和free等函数根据需要动态地分配和释放字符数组的空间(这个空间长度由分配时确定,也是顺序存储空间)。
●目标串和模式串:在串匹配运算过程中,将主串称为目标串,而将需要匹配的子串称为模式串,两者是相对的。
●有效位移和无效位移:在串定位运算中,模式串从目标的首位开始向右位移,每一次合法位移后如果模式串与目标中相应的字符相同,则这次位移就是有效位移(也就是从此位置开始的匹配成功),反之,若有不相同的字符存在,则此次位移就是无效位移(也就是从此位置开始的匹配失败)。
4.2 假设有如下的串说明:char s1[30]="Stocktom,CA", s2[30]="March 5 1999", s3[30], *p;(1)在执行如下的每个语句后p的值是什么?p=stchr(s1,'t'); p=strchr(s2,'9'); p=strchr(s2,'6');(2)在执行下列语句后,s3的值是什么?strcpy(s3,s1); strcat(s3,","); strcat(s3,s2);(3)调用函数strcmp(s1,s2)的返回值是什么?(4)调用函数strcmp(&s1[5],"ton")的返回值是什么?(5)调用函数stlen(strcat(s1,s2))的返回值是什么?解:(1) stchr(*s,c)函数的功能是查找字符c在串s中的位置,若找到,则返回该位置,否则返回NULL。
第四章 串
第一部分:知识点
一、串的概念
由零个或多个字符组成的有限序列,一般记作
S = ‘a1a2a3...an’ (n0)
其中 S----串名, a1a2a3...an ----串值,ai可以是字母、数字或其他字符,
n----串长,当n=0时S是空串
串中任意连续的字符组成的子序列称为该串的子串。
主串:包含子串的串。
位置:字符在序列中的序号为该字符在串中的位置。
子串在主串中的位置则用子串的第一个字符在主串中的位置来表示。
例:s=“ababcabcac” , t=“abc” 子串t 在主串s中的位置为3
串相等:当两个串长度相同,并且各个对应位置的字符都相等时称两个串相等。
二、串的表示
串在计算机内有三种表示方式(1)定长顺序存储表示(2)堆分配存储表示(3)块链存储表示
1、串的定长顺序存储表示
#define MAXSTRLEN 255
// 用户可在255以内定义最大串长
typedef unsigned char Sstring[MAXSTRLEN + 1];
串的实际长度可在这个予定义长度的范围内随意设定,超过予定义长度的串值则被舍去,称之为“截断” 。
按这种串的表示方法实现的串的运算时,其基本操作为 “字符序列的复制”。
2、串的堆分配存储表示
typedef struct {
char *ch;
// 若是非空串,则按串长分配存储区,
// 否则ch为NULL
int length; // 串长度
} HString;
系统利用函数malloc( )和free( )进行串值空间的动态管理,为每一个新产
生的串分配一个存储区,称串值共享的存储空间为“堆”。
这类串操作实现的算法为:先为新生成的串分配一个存储空间,然后进行串值的复制。
3、串的块链存储表示
串的链式存储结构称为链串,链串的组织形式与一般的链表类似。
“节点大小”:由于串结构的特殊性,结点中的每个数据元素是一个字符,则用链表存储串值时,即每个结点可以存放一个字符,也可以存放多个字符,如图4.1所示。
图4.1 串的链式存储示意图
三、串的模式匹配算法
模式匹配:子串的定位操作。
此时将子串又称为模式串。
即下面操作:Index (S, T, pos):从主串s 的第pos个字符开始查找子串(模式串)t第一次出现的位置。
1、简单匹配算法
算法的基本思想是:从主串s的第pos个字符起和模式串t的第一个字符比较之,若相等,则继续逐个比较后续字符,否则从主串s的下一个字符起再重新和模式t的字符比较之。
依此类推,直至模式t中的每个字符依次和主串s中的一个连续的字符序列相等,则称匹配成功,函数值为和模式串中第一个字符相等的字符在主串s中的序号.否则称匹配不成功,函数值为0。
例:s=‘ababcabcacbab’ t = ‘abcac’ pos=1 ,匹配过程如下:
该算法最坏情况下T(n) = O(m*n)
2.改进的模式匹配算法—KMP算法
该算法消除了主串指针的回溯,当匹配过程中产生“失配”(即
s i≠tj)时,主串指针i不动,而是利用得到的部分匹配的结果,将模式串“向右滑动”尽可能远的距离,设此时j的位置是next[j],然后继续从此位置进行匹配,显然算法的时间复杂度是O(m+n)。
a b c *
a b c a c
算法的关键就是next[j]的计算,研究后得出next[j]的值只与模式串有关。
关键是从匹配过的子串中找匹配的最长前缀子串和后缀子串(相互重叠的最大真子串) ,next[j]就是长度值+1.
例如:
j 1 2 3 4 5 j 1 2 3 4 5 6 7 8
模式串 a b c a c 模式串 a b a a b c a c
next[j] 0 1 1 1 2 next[j] 0 1 1 2 2 3 1 2
串匹配过程:
i=1,j=1
先由模式串计算next值。
比较s[i]和t[j],如果对应相等,则继续向后匹配i++,j++,一旦失配,更新j=next[j];
当j=0时,i++,j++;然后重复以上操作直到串t扫描完毕,匹配成功,或串s扫描完毕,匹配失败。
发现,用上述方法计算出的next[j],有时并不是模式串向右滑动的最大距离。
例如下面这种特殊情况:
S = aaabaaabaaabaaabaaab
T = aaaab
next[j]= 0 1 2 3 4
当j=4时失配:
i=4
aaa b aaabaaabaaabaaab
aaa a b
j=4
此时next[4]=3,调整j=3,模式串向右滑动一位,发现调整后仍然失
配,需要再根据next函数,调整j值,如此直到j=0,原因失配时t j值与
t next[j]相同。
设next[j]=k,若T[j]==T[k]则:修正next[j]= next[k]
用nextval[j]表示next[j]的修正值,则有:
k=next[j]= nextval[j] T[j]≠ T[k]
nextval[j]=
nextval[k] 否则
例如计算nextval值
j 1 2 3 4 5
T = a a a a b
nextval[j]= 0 0 0 0 4
第二部分:习题
一、选择题
1.下面关于串的的叙述中,哪一个是不正确的?( )
A.串是字符的有限序列 B.空串是由空格构成的串
C.模式匹配是串的一种重要运算 D.串既可以采用顺序存储,也可以
采用链式存储
2 若串S1=‘ABCDEFG’, S2=‘9898’ ,S3=‘###’,S4=‘012345’,
执行
concat(replace(S1,substr(S1,length(S2),length(S3)),S3),substr(S4,index(S2,‘8’),length(S2))) 其结果为( )。
A.ABC###G0123 B.ABCD###2345 C.ABC###G2345 D.ABC###2345
E.ABC###G1234 F.ABCD###1234 G.ABC###01234
3.设有两个串p和q,其中q是p的子串,求q在p中首次出现的位置的算
法称为( )
A.求子串 B.联接 C.匹配 D.求串长
4.已知串S=‘aaab’,其Next数组值为( )。
A.0123 B.1123 C.1231 D.1211
5.串 ‘ababaaababaa’ 的next数组为( )。
A.012345678999 B.012121111212 C.011234223456 D.0123012322345
6.字符串‘ababa a bab’ 的nextval 为( )
A.(0,1,0,1,0,4,1,0,1) B.(0,1,0,1,0,2,1,0,1) C.(0,1,0,1,0,0,0,1,1) D.(0,1,0,1,0,1,0,1,1 )
7.模式串t=‘abcaabbcabcaabdab’,该模式串的next数组的值为( ),nextval数组的值为 ( )。
A.0 1 1 1 2 2 1 1 1 2 3 4 5 6 7 1 2 B.0 1 1 1 2 1 2 1 1 2 3 4 5 6 1 1 2
C.0 1 1 1 0 0 1 3 1 0 1 1 0 0 7 0 1 D.0 1 1 1 2 2 3 1 1 2 3 4 5 6 7 1 2
E.0 1 1 0 0 1 1 1 0 1 1 0 0 1 7 0 1 F.0 1 1 0 2 1 3 1 0 1 1 0 2 1 7 0 1
8. 设S为一个长度为n的字符串,其中的字符各不相同,则S中的互异的非平凡子串(非空且不同于S本身)的个数为( )。
n+(n-1)+…2=(n+2)*(n-1)/2
二、填空题
1.空格串是指__(1)__,其长度等于___(2)__。
2.组成串的数据元素只能是________。
3.一个字符串中________称为该串的子串 。
4.INDEX(‘DATASTRUCTURE’,‘STR’)=________。
5.设正文串长度为n,模式串长度为m,则串匹配的KMP算法的时间复杂度为________。
6. 设T和P是两个给定的串,在T中寻找等于P的子串的过程称为__(1)__,又称P为__(2)__。
7.串是一种特殊的线性表,其特殊性表现在__(1)__;串的两种最基本的存储方式是__(2)__、__(3)__;两个串相等的充分必要条件是
__(4)__。