- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第四章 串(String) 串及其基本操作 串的存储结构 串基本操作的实现 串的模式匹配算法 串的应用 基本概念 定义:由0个或多个字符组成的有限序列。 在用C语言描述的时候,串用双引号(”)表示。 注意区别: (1) 空格字符串”_” 与空串””。 (2) 单个字符的字符串”a”与单个字符’a’。 基本操作 赋值:Assign(s, t) 求长度:Length(s) 判等:Equal(s, t) 联接:Concat(s, t) 定位:Index(s, t) 求子串:Substr(s, t, i, k) 置换:Replace(s, t, v) 插入:Insert(s, i, t) 删除:Delete(s, i, k) Replace(s,t,v) 初始条件:s,t,v为串名或串值。 操作结果:若主串s中存在与串t相等的子 串,则用串v替代主串s中所有 不重叠的子串;否则,不作任 何操作。 Insert(s,i,t) 初始条件:s,t为串名或串值。 操作结果:若 0≤i≤Length(s),则在串s的 第i个字符之前插入串t。 Delete(s,i,k) 初始条件:s为串名或串值。 操作结果:若满足 0≤i≤Length(s),且 0≤k≤Length(s)-1,则从串s 中删除从第i个字符起,长度 为k的子串。 串的存储结构 静态存储结构: 将串定义为字符型数组,其存储空间分配在编译时完成,不能更改。 (1)紧缩格式 (2)非紧缩格式 动态存储结构: 串的存储空间在程序运行时动态分配。 (1)链式存储结构 (2)堆存储结构 静态存储结构 定义:用一组地址连续的存储单元存储串的字符序列。 方法一:每个存储单元存放一个字符。(非紧缩存储方法) 问题:大多数计算机采用字编址,而一个字占用多个字节(一般是4个),另一方面,一个字符只占用一个字节。——浪费存储空间 方法二: 一个字节存放一个字符,即以前每个存储单元可以存放多个(4)字符。(紧缩存储方法) 动态存储结构 1、链式存储结构 包含字符域和指针域的结点链结构,其中字符域存放字符,指针域存放指向下一个结点的指针。 问题:如果字符域内只存放一个字符,则会引入过多的存储空间。 解决办法:块链接结构。 每个结点存放若干个(如80个)字符。 2、堆存储结构 系统将一个空间足够大、地址连续的存储空间作为串值的可利用空间,每当建立一个新串时,系统就从这个可利用空间内划出一个大小与串长度相等的空间存储新串的串值。每个串的串值各自存储在一组地址连续的存储单元中,他们的存储地址是在程序执行过程中动态分布的。 基本操作的实现 以求子串的实现方法,讨论三种存储结构下基本操作的实现方法。 二、堆存储结构 在堆存储结构下,求子串的操作由两种实现方法,一种是共享法,另一种是重新赋值法。 (1)共享法 用共享法求子串操作时,主串s及所求子串t在堆中只有一个存储映象。 优点:节约存储空间 缺点: 当主串或子串改变时,会影响其共享空间的串值,可能引起出错。 串的模式匹配算法 串定位运算又称为模式匹配(Pattern Matching)或串匹配(String Matching)。在串匹配中,一般将主串称为目标串,子串称之为模式串。设S为目标串,T为模式串,且不妨设: S=“s0s1s2…sn-1” T=“t0t1…tm-1” 串的匹配实际上是对于合法的位置0≦i≦n-m依次将目标串中的子串s[i..i+m-1]和模式串t[0..m-1]进行比较,若s[i..i+m-1]=t[0..m-1],则称从位置i开始的匹配成功,亦称模式t在目标s中出现;若s[i..i+m-1] ≠t[0..m-1],则称从位置i开始的匹配失败。其中,位置i称为位移。 串匹配的算法很多,这里我们只讨论两种算法。 总结以上两种情况,可以发现一旦si和tj比较不相等,主串s的指针不必回溯,主串si或si+1可直接与模式串tk(0≤k≤j)比较,k的决定与主串s并无关系,而只与模式串t本身的构成有关,既从模式串t就可求出k值。 设S=“s0s1…sn-1”, t=“t0t1…tm-1”,当si≠tk时(0≤i<n-m,0≤j<m)存在 “t0t1…tj-1” = “si-jsi-j+1…si-1”。 若模式串中存在可相互重叠的真子串,满足 “t0t1…tk-1” = “t
文档评论(0)