版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、(String)(String)是零个或多个字符组成的有限序列。是零个或多个字符组成的有限序列。一般记作一般记作 S= “aS= “a1 1a a2 2a a3 3aan n”,其中,其中 S S 是串名,是串名,双引号括起来的字符序列是串值;双引号括起来的字符序列是串值;a ai i(1in) (1in) 可以是字母、数字或其它字符;串中所包含的字可以是字母、数字或其它字符;串中所包含的字符个数称为该串的符个数称为该串的。长度为零的串称为。长度为零的串称为 (Empty String)(Empty String),它不包含任何字符。,它不包含任何字符。 4.1 串类型的定义串类型的定义一、串
2、的基本概念空串和空格串不同,如空串和空格串不同,如“ ”“ ”和和“”“”分分别表示长度为别表示长度为1 1的空格串和长度为的空格串和长度为0 0的空串()。的空串()。 空串是任意串的子串,任意串是其自身的子串。空串是任意串的子串,任意串是其自身的子串。 串中任意个连续字符组成的子序列称为该串的串中任意个连续字符组成的子序列称为该串的,包含子串的串相应地称为包含子串的串相应地称为。通常将子串在主串中首次。通常将子串在主串中首次 出现时,该子串的首字符在主串中对应的序号,定义为出现时,该子串的首字符在主串中对应的序号,定义为 (或序号)。(或序号)。A = “A = “”,B = B = “”
3、 则则 B B 是是 A A 的子串,的子串,A A 为主串。为主串。B B 在在 A A 中出现了两次,其中首次出现所对应的主串位中出现了两次,其中首次出现所对应的主串位置是置是 3 3 。因此,。因此,B B 在在 A A 中的位置为中的位置为 3 3 。二、串的抽象数据类型定义如下:ADT String 数据对象数据对象:D ai |aiCharacterSet, i=1,2,.,n, n0 数据关系数据关系:R1 | ai-1, ai D, i=2,.,n 基本操作基本操作: StrAssign (&T, chars) StrCopy (&T, S) DestroySt
4、ring(&S) StrEmpty (S) StrCompare (S, T) StrLength(S) Concat (&T, S1, S2)SubString (&Sub, S, pos, len) Index (S, T, pos) Replace (&S, T, V)StrInsert (&S, pos, T) StrDelete (&S, pos, len) ClearString (&S) ADT String StrAssign (&T, chars) 初始条件:chars 是字符串常量。 操作结果:把 chars的
5、值赋给 T 。 StrCopy (&T, S) 初始条件:串 S 存在。 操作结果:由串 S 复制得串 T。 DestroyString (&S) 初始条件:串 S 存在。 操作结果:串 S 被销毁。 StrEmpty (S)初始条件:串S存在。操作结果:若 S 为空串,则返回 true,否则返回 false。 StrCompare (S, T)初始条件: 串 S 和 T 存在。操作结果: 若S T,则返回值 0; 若S T,则返回值 0; 若S T,则返回值 0。例如:例如:StrCompare(data, state) StrCompare(cat, case) StrLe
6、ngth (S) 初始条件:串 S 存在。 操作结果:返回 S 的长度。 Concat (&T, S1, S2)初始条件:串 S1 和 S2 存在。 操作结果:用 T 返回由 S1 和 S2 联接而成的新串。例如例如: Concate( T, man, kind) 求得 T = SubString (&Sub, S, pos, len)初始条件:操作结果: 用 Sub 返回串 S 的第 pos 个字符起 长度为 len 的子串。串 S 存在,1posStrLength(S) 且 0lenStrLength(S)-pos+1。例如:例如: SubString( sub, comm
7、ander , 4, 3)求得求得 sub = ; SubString( sub, commander , 1, 9)求得求得 sub = SubString(sub, commander, 4, 7) sub = ? SubString(sub, beijing, 7, 2) = ? sub = ?SubString(student, 5, 0) = 起始位置和子串长度之间存在约束关系起始位置和子串长度之间存在约束关系长度为长度为 0 的子串为的子串为“合法合法”串串1posStrLength(S) ,0lenStrLength(S)-pos+1。 Index (S, T, pos)初始条件
8、:串S和T存在,T是非空串, 1posStrLength(S)。操作结果: 若主串 S 中存在和串 T 值相同 的子串, 则返回它在主串 S 中 第pos个字符之后第一次出现 的位置;否则函数值为0。 假设 S = abcaabcaaabc , T = bca Index(S, T, 1) = 2;Index(S, T, 3) =?;Index(S, T, 8) =?; “子串在主串中的位置子串在主串中的位置”意指子串中的第一个字符在主串中的位序位序。60bca bca Replace (&S, T, V) 初始条件:初始条件:串S, T和 V 均已存在, 且 T 是非空串。 操作结果
9、:操作结果:用 V 替换主串 S 中出现 的所有与(模式串)T 相等的不重叠不重叠的子串。例如:假设 S = abcaabcaaabca, T = bca 若 V = x , 则经置换后得到 S = a a aa 若 V = bc , 则经置换后得到 S = aaaabca bca bcabca不重叠:不重叠:假设 S = abcabcabcab, T = abcab V = x , 则经置换后得到 S = c abcababcababcab StrInsert (&S, pos, T)初始条件:串S和T存在, 1posStrLength(S)1。操作结果:在串S的第pos个字符之前
10、插入串T。例如:例如:S = chater ,T = rac , 则执行 StrInsert(S, 4, T) 之后得到 S = character StrDelete (&S, pos, len)初始条件:串S存在 1posStrLength(S)-len+1。操作结果:从串S中删除第pos个字符 起长度为len的子串。 ClearString (&S) 初始条件:串S存在。 操作结果:将S清为空串。 对于串的基本操作集可以有不同的定义方法,在使用高级程序设计语言中的串类型时,应以该语言的参考手册为准以该语言的参考手册为准。 gets(str) 输入一个串; puts(str
11、) 输出一个串; strcat(str1, str2) 串联接函数; strcpy(str1, str2, k) 串复制函数; strcmp(str1, str2) 串比较函数; strlen(str) 求串长函数;例如:C语言函数库中提供下列串处理函数: 串赋值StrAssign、串复制Strcopy、 串比较StrCompare、求串长StrLength、 串联接Concat以及求子串SubString 等六种操作构成串类型的最小操作子集。在上述抽象数据类型定义的13种操作中,而 其他串操作(除串清除ClearString和 串销毁DestroyString外)可在这个最 小操作子集上实现
12、。 例如,可利用求串长和求子串、串比较等操作实现定位函数 Index( S, T, pos )。 StrCompare(SubString(S, i, StrLength(T), T ) S 串(长度n) T 串 T 串iposn-m+1算法的基本思想为:算法的基本思想为:? 0(长度m)int Index (String S, String T, int pos) / T为非空串。若主串S中第pos个字符之后存在与 T相等的子串, / 则返回第一个这样的子串在S中的 位置,否则返回0 if (pos 0) / if return 0; / S中不存在与T相等的子串 / Indexn = St
13、rLength(S); m = StrLength(T); i = pos;while ( i = n-m+1) / whileSubString (sub, S, i, m);if (StrCompare(sub,T) != 0) +i ;else return i ;又如串的置换函数: S 串(n)T 串(m) V 串 V 串pospos subinews 串sub= i+mpos=n-m+1mvoid replace(String& S, String T, String V) SubString(sub, S, pos, n-pos+1); / 剩余串Concat( S, ne
14、ws, sub );n=StrLength(S); m=StrLength(T); pos = 1;StrAssign(news, NullStr); i=1; 串的逻辑结构和线性表极为相似,区别区别仅在于串的数据对象约束为字符集。 串的基本操作和线性表有很大差别。串的基本操作和线性表有很大差别。 在线性表的基本操作中,大多以“单个元素”作为操作对象; 在串的基本操作中,通常以“串的整体”作为操作对象。 在程序设计语言中,若串只是 作为输入或输出的常量出现,则只 需存储此串的串值,即字符序列即 可。但在多数非数值处理的程序中, 串也以变量的形式出现。4.2 串的表示和实现串的表示和实现一、串的
15、定长顺序存储表示一、串的定长顺序存储表示二、串的堆分配存储表示二、串的堆分配存储表示三、串的块链存储表示三、串的块链存储表示 #define MAXSTRLEN 255 / 用户可在255以内定义最大串长 typedef unsigned char SString MAXSTRLEN + 1; / 0号单元存放串的长度一、串的定长顺序存储表示一、串的定长顺序存储表示 按这种串的表示方法实现的串的运算时,其基本操作为 “字符序列的复制字符序列的复制”。 串串的实际长度可在这个予定义长度的范围内随意设定,超过予定义长度的串值则被舍去,称之为“截断截断” 。 Status Concat(SStrin
16、g S1, SString S2, SString &T) / 用T返回由S1和S2联接而成的新串。若未截断, 则返回TRUE,否则FALSE。 return uncut; / Concat例例1.串的联接算法中需分三种情况处理: T1.S10 = S11.S10; TS10+1.S10+S20 = S21.S20; T0 = S10+S20; uncut = TRUE; if (S10+S20 = MAXSTRLEN) / 未截断未截断 else if (S10 MAXSTRLEN) / s2截断截断,s1未截断未截断 else / s1截断(仅取S1)T1.S10 = S11.S1
17、0;TS10+1.MAXSTRLEN = S21.MAXSTRLENS10;T0 = MAXSTRLEN; uncut = FALSE; T1.MAXSTRLEN = S11.MAXSTRLEN; T0 = MAXSTRLEN uncut = FALSE; Status SubString(SString &Sub, SString S, int pos, int len) / 用Sub返回串S的第pos个字符起长度为len的字串。 / 其中1posStrLength(S) ,0lenStrLength(S)-pos+1 if (posS0 | lens0-pos+1) return
18、ERROR; Sub1.len=Spos.pos+len-1; Sub0=len; return OK; /SubString例例2. 求子串 SubString(&Sub, S, pos,len) :即将串即将串S中从第中从第pos个字符开始长度为个字符开始长度为len的字符序列复制到串的字符序列复制到串Sub中。中。 typedef struct char *ch; / 若是非空串,则按串实际长度分配 /存储区,否则 ch 为NULL int length; / 串长度 HString;二、串的堆分配存储表示二、串的堆分配存储表示 以一组地址连续的存储单元存放串值字符序列,但它们的
19、存储空间是在程序执行过程中动态分配而得。通常,C语言中提供的串类型就是以这种存储方式实现的。系统利用函数malloc( ) 和 free( ) 进行串值空间的动态管理,为每一个新产生的串分配一个存储区,称串值共享的存储空间为“堆堆”。 这类串操作实现的算法为: 先为新生成的串分配一个存储空间,然后 进行串值的复制。Status Concat(HString &T, HString S1, HString S2) / 用T返回由S1和S2联接而成的新串 if (T.ch) free(T.ch); / 释放旧空间 if (!(T.ch =new charS1.length+S2.lengt
20、h) exit (OVERFLOW); T.length = S1.length + S2.length; T.ch0.S1.length-1 = S1.ch0.S1.length-1; T.chS1.length.T.length-1 = S2.ch0.S2.length-1; return OK; / Concat Status SubString(HString &Sub, HString S, int pos, int len) / 用用Sub返回串返回串S的第的第pos个字符起长度为个字符起长度为len的子串的子串 if (pos S.length | len S.lengt
21、h-pos+1) return ERROR; if (Sub.ch) free (Sub.ch); / 释放旧空间释放旧空间 if (!len) Sub.ch = NULL; Sub.length = 0; / 空子串空子串 else / 完整子串完整子串 return OK; / SubString if(!(Sub.ch = new charlen) return ERROR; Sub.ch0.len-1 = S.chpos-1.pos+len-2; Sub.length = len;三、串的块链存储表示三、串的块链存储表示 可用链表来存储串值,由于串的每个数据元素是一个字符,因此用链表存
22、储时,通常一个结点中存放的不是一个字符,而是一个子串。存储密度存储密度 = 数据元素所占存储空间实际分配的存储空间 A B C D E F G H I # # # head Ahead B C I H #define CHUNKSIZE 80 / 可由用户定义的块大小 typedef struct Chunk / 结点结构 char chCUNKSIZE; struct Chunk *next; Chunk; typedef struct / 串的链表结构 Chunk *head, *tail; / 串的头和尾指针 int curlen; / 串的当前长度 LString; 例如: 在编辑系统
23、中,整个文本编辑区可以看成是一个串,每一行是一个子串,构成一个结点。即: 同一行的串用定长结构(80个字符), 行和行之间用指针相联接。实际应用时,可以根据问题所需来设置结点的大小。 这是串的一种重要操作,很多 软件,若有“编辑编辑”菜单项的话, 则其中必有“查找查找”子菜单项。4.3串的模式匹配算法串的模式匹配算法初始条件初始条件:串 S 和 T 存在,T 是非空串, 1posStrLength(S)。 首先,回忆一下查找(串匹配)操作的定义:INDEX (S, T, pos)INDEX (S, T, pos)操作结果操作结果:若主串 S 中存在和串 T 值 相同的子串,则返回它在主串 S
24、中 第 pos 个字符之后第一次出现 的位置; 否则函数值为0。int Index (String S, String T, int pos) / T为非空串。若主串S中第pos个字符之后存在与 T相等的子串,则返回第一个 这样的子串在S中的 位置,否则返回0 if (pos 0) n = StrLength(S); m = StrLength(T); i = pos; while ( i m (j=m+1)ijijijinj T 串一、简单算法一、简单算法j=1i=i-j+2返回?返回? 匹配不成功!匹配不成功!:(i-m)int Index(SString S, SString T, in
25、t pos) / 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数值为0。 / 其中,T非空,1posStrLength(S)。 i = pos; j = 1; while (i = S0 & j T0) return i-T0; else return 0; / Index 先比较模式串的字符, 再比较模式串的字符, 最后比较模式串中从第二个 到第 n-1 个字符。二、二、首首尾尾匹配算法匹配算法int Index_FL(SString S, SString T, int pos) sLength = S0; tLength = T0; i = pos; patStar
26、tChar = T1; patEndChar = TtLength; while (i = sLength tLength + 1) if (Si != patStartChar) +i; /重新查找匹配起始点 else if (Si+tLength-1 != patEndChar) +i; / 模式串的“尾字符”不匹配 else return 0; 检查中间字符的匹配情况检查中间字符的匹配情况 k = 1; j = 2; while ( j tLength & Si+k = Tj) +k; +j; if ( j = tLength ) return i; else +i; / 重新开
27、始下一次的匹配检测KMP算法的时间复杂度可以达到O(m+n)三、三、KMP(KMP(D.E.Knuth, J.H.Morris, V.R.Pratt) 算法算法 每当一趟匹配过程中出现字符比较不每当一趟匹配过程中出现字符比较不等时,不需回溯等时,不需回溯 i 指针,而是利用已经得到指针,而是利用已经得到的的“部分匹配部分匹配”的结果将模式串向右的结果将模式串向右“滑滑动动”尽可能远的一段距离后,继续进行比尽可能远的一段距离后,继续进行比较。较。 当 Si Tj 时, 已经得到的结果: Si-j+1.i-1 = T1.j-1 则有 Si-k+1.i-1 = T1.k-1 S(i-j)S1S(i-
28、j+1)S (i-1)S nS ip 1p (j-1)p mp j主串:主串:S S1 1 S Sn n子串:子串:P P1 1 P Pm mp(j-k+1)p(j-1)p1p(k-1)p1p(k-1)p mp j-1p kp j S(i-j)S1S(i-j+1)S (i-1)S nS iS(i-k+1)S(i-1)p(j-k+1)p(j-1)S(i-k+1)S(i-1)iijj定义:定义:模式串的next函数其它情况当此集合不空时且时当, 1 , pp ppp jk1 |Maxk1j, 0j1 - j1k- j1 -k21nextj12345678模式模式abaabcacNextj int
29、Index_KMP(SString S, SString T, int pos) / 1posStrLength(S) i = pos; j = 1; while (i = S0 & j T0) return i-T0; / 匹配成功 else return 0; / Index_KMP这实际上也是一个匹配的过程,不同在于:主串和模式串是同一个串. 求 next 函数值的过程是一个递推过程,分析如下分析如下:已知已知:next1 = 0;(1)若若: Tj = Tk , 则则: nextj+1 = k+1(2)若若: Tj Tk , 则则 需往前回朔, 假设假设:nextj = k;j12345678模式模式abaabcacNextj如何求如何求next6?next6?当前当前j=5,next5=2,j=5,next5=2,考察考察 p p5 5 与与 p p2 2 :p p5 5 = p= p2 2 ,所以所以next6=next5+1next6=next5+1,如何求如何求next7?next7?当前当前j=6,next6=3,j=6,next6=3,考察考察 p p6 6 与与 p p3 3 :p p6 6 p p3 3 ,next3=1next3=1,继续,继续考察考察 p p6 6 与与 p p1 1 :p p6 6 p p1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 多发性骨髓瘤CRAB典型表现与标准化诊断指南
- 2026年四川省人教版初中物理上册第4章力学基础综合测试卷
- 2026年浙江省人教版小学五年级语文上册第9单元古诗文鉴赏练习题
- 2026年人教版小学四年级道德与法治第11课练习题
- 2025-2026年重庆市苏教版七年级英语第2单元课后练习题
- 2025-2026年江苏省人教版高中物理第6章光学同步练习题
- 2025-2026年江苏省苏教版七年级英语下册第7单元阅读理解专项训练习题
- 2025-2026年国际贸易实务专项训练题库
- 2025-2026年浙江省北师大版七年级英语第1单元课后练习题
- 2026年人教版高中物理选修3-8原子物理专项训练题库
- 2026天津地铁1号线综合站务员招聘笔试备考试题及答案详解
- 培智数学16册全册教学设计
- 2026年中国广电5g试题及答案
- 电梯装修施工方案
- GB/T 47911-2026小微型企业安全生产标准化管理体系要求
- 中国银屑病诊疗指南(2025版)
- 26新六(上)语文小纸条课课贴
- 青浦区2025-2026学年第二学期期末考试六年级数学学试卷及答案(上海新教材沪教版)
- SYT 6696-2025《储油罐机械清洗作业规程》
- 2026-2030中国便携式肺功能仪行业需求规模与前景动态预测报告版
- 简约商务企业谈判技巧培训模板
评论
0/150
提交评论