串类型的定义串的表示和实现串的模式匹配算法PPT资料42页
串

5.1 串的定义及基本操作
5.1.2 串的基本操作 假设S1=abcd,S2=efg。 ① Assign(S1,S2):串的赋值。 Assign(S1,S2)中S1为串变量名,S2是串变量名或字符系列,赋值操作
是将一个字符串S2赋给串变量S1。例如,Assign(S1,S2)或 Assign(S1,“efg”),则S1=“efg”。 ② Concat(S1,S2):串的连接。 Concat(S1,S2)就是表示将串S2的值紧接着放在串S1的值的末尾而组成 一个新串。例如,Concat(S1,S2)=“abcdefg”, Concat(S2,S1)=“efgabcd”。 ③ Length(S):求串长。 Length(S)表示求串S中字符的个数。例如,Length(“”)=0。
下一页 返回
5.2 串的存储结构
这时,要唯一确定S串,通常需要引进两个变量,一个是SH,用以存放 S串中第一个字符在向量V中的位置;另一SL,用以存放串的长度。针 对上例,SH=i,SL=7 在这种表示法中,访问串的子串是容易的。例如 ,要求得S串的子串S1=“GRAM”,只要访问V[i+3]到V[i+6]的字符 ,便可得到S1串。但在这种结构中进行插入和删除操作就较为困难。
本章介绍串的基本概念、存储结构及相关算法的实现等基本问题。
下一页 返回
5.1 串的定义及基本操作
5.1.1 串的定义
串(String)是n≥0个字符组成的有限序列,一般记为
S=“a1,a2,…,an”
式中,S为字符串串名;a1,a2,…,an为串值,ai(0≤i≤n)可以是字母和其他 符号(如>、=、*等);n为串长,即串值中字符的个数。串长n=0时,
串的模式匹配算法

串串(String)又叫做字符串,是一种特殊的线性表的结构,表中每一个元素仅由一个字符组成。
随着计算机的发展,串在文字编辑、词法扫描、符号处理以及定理证明等诸多领域已经得到了越来越广泛的应用。
第一节串的定义和表示1、串的逻辑结构定义串是由零个到任意多个字符组成的一个字符序列。
一般记为:S=’ a1a2a3……a n’(n>=0)其中S为串名,序列a1a2a3……a n为串值,n称为串的长度,我们将n=0的串称为空串(null string)。
串中任意一段连续的字符组成的子序列我们称之为该串的子串,字符在序列中的序号称为该字符在串中的位置。
在描述中,为了区分空串和空格串(s=‘’),我们一般采用来表示空串。
2、串的基本操作串一般包含以下几种基本的常用操作:1、length(S),求S串的长度。
2、delete(S,I,L),将S串从第I位开始删除L位。
3、insert(S,I,T),在S的第I位之前插入串T。
4、str(N,S),将数字N转化为串S。
5、val(S,N,K),将串S转化为数字N;K的作用是当S中含有不为数字的字符时,K记录下其位置,并且S没有被转化为N。
3、串的储存结构一般我们采用以下两种方式保存一个串:1、字符串类型,描述为:const n=串的最大长度type strtype=string[n]这里由于tp的限制,n只能为[1..255]。
在fp或者delphi中,我们还可以使用另外一种类型,描述为:const n=串的最大长度type strtype=qstring[n]这里的n就没有限制了,只要空间允许,开多大都可以。
2、数组来保存,描述为:const n=串的最大长度type strtype=records:array[1..n] of char;len:0..n;end;第二节模式匹配问题与一般的线性表不同,我们一般将串看成一个整体,它有一种特殊的操作——模式匹配。
数据结构 第四章 串

4.1 4.2
串类型的定义 串的表示和实现
4.2.1 定长顺序存储表示 4.2.2 堆分配存储表示 4.2.3 串的块链存储表示
第四章 串
4.1 串类型的定义
一、串的基本概念 定义:字符串是 n ( 0 ) 个字符的有限序列
记作 S = “c1c2c3…cn”
其中:
S 是串名字 “c1c2c3…cn”是串值 ci 是串中字符 n 是串的长度
4.1 串类型的定义
一、串的基本概念
串中任意个连续字符组成的子序列称为该串的
子串,包含子串的串相应地称为主串。
子串在主串中首次出现时的该子串的首字符 对应的主串中的序号,定义为子串在主串中的
序号(或位置)
例如,设A和B分别为 A=“This is a string” B=“is”
4.1 串类型的定义
提取子串的算法示例
pos = 3, len = 3 infini ty
pos = 6, len = 4 infini ty
fin
len S[0]-pos+1
超出 len > S[0]-pos+1
合法参数条件: Pos>=0, Pos<=S[0], Len>=0
len <=S[0]-pos+1
求子串的过程即为复制字符序列的过程,将串S中的 第pos个字符开始长度为len的字符复制到串T中。
1、串的插入的动态实现过程 s.length+ t.length
SA
l o v el y
pos Tl o
t.length
vely
g irl!
t.length
1、串的插入的动态实现过程 s.length+ t.length
数据结构第4章串B教学ppt

《算法导论》
Thomas H. Cormen等编著的经典算法教材,深 入讲解了算法设计和分析的方法,包括串的模式 匹配等算法。
MOOC课程
中国大学MOOC、Coursera等在线教育平台上 提供了大量与数据结构和算法相关的课程,可以 系统地学习相关知识和技能。
压缩串处理技术
针对大规模文本数据,研究压缩串处理技术可以减少存储 空间占用,提高处理效率,是未来发展的重要方向之一。
串的并行处理技术
利用并行计算技术加速串的处理过程,提高处理效率,是 未来研究的热点之一。需要解决并行化算法设计、并行计 算框架选择等问题。
拓展学习资源推荐
1 2 3
《数据结构(C语言版)》
Sunday算法
Sunday算法是一种简单且高效的字符串匹配算法,其核心思 想是当发现不匹配的字符时,直接跳过主串中当前字符之前 的所有字符,将模式串与主串的下一个字符进行比较。
03
串的应用举例
文本编辑中的串操作
01
02
03
字符串匹配
在文本编辑中,经常需要 查找或替换特定的字符串, 这可以通过串的匹配操作 实现。
可以使用数组下标和字 符串截取函数`substr()` 实现串的截取,如`char ch = str[2];`或 `std:string sub = str.substr(2, 4);`。
Python语言实现串的基本操作
串的定义与初始化
在Python中,串使用引号(单引号、双 引号或三引号)进行定义和初始化,如`s = 'hello'`或`s = "hello"`。的比较
数据结构-第4章 串

4.1 串的类型定义
子串的序号:将子串在主串中首次出现时的该 子串的首字符对应在主串中的序号,称为子串 在主串中的序号(或位置)。 【例】 A=“abcdefbbcd”,B=“bcd”,B在A中的 序号为2。 特别地,空串是任意串的子串,任意串是其自 身的子串。
4.1.2 串的抽象数据类型定义
//查找ab子串
if (p->data==‘ a’ && p->next->data==‘b’)
{ p->data=‘x’; p->next->data=‘z’;
q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data=‘y’;
q->next=p->next; p->next=q;
s: a a a a b c d
t: a ab bac acb bc c ✓ 匹配成功 算法的思路是从s的每一个字符开始依次与t的 字符进行匹配。
4.2.1 Brute-Force算法
int BFIndex(SqString s,SqString t)
{ int i=0, j=0,k;
while (i<s.length && j<t.length)
4.1 串的类型定义 4.2 串的表示和实现 4.3 串的模式匹配算法
本章要求
理解: 1、串的基本概念、类型定义 2、串的存储表示和实现 3、串的KMP算法
掌握: 4、串的简单模式匹配算法(BF)
第4章 串的基本概念
串(或字符串):是由零个或多个字符组成 的有限序列。
串的逻辑表示: S=“a1a2…ai…an”,其中S为 串名,ai (1≤i≤n)代表单个字符,可以是字母、 数字或其它字符(包括空白符)。 串值:双引号括起来的字符序列。双引号不是 串的内容,只起标识作用。
串类型定义串表示和实现串模式匹配算法串操作应用举例(可编辑)

串类型定义串表示和实现串模式匹配算法串操作应用举例串类型的定义串的表示和实现串的模式匹配算法串操作应用举例 4.1 串类型的定义基本概念 ADT串的定义 4.2 串的表示和实现堆分配存储结构表示时的(只含最小操作子集)基本操作的算法描述 4.3 串的模式匹配算法 4.4 串操作应用举例 else T[0..STRLEN] S1[0..STRLEN];// T[0] S1[0] STRLEN uncut FALSE; return uncut; // Concat 在串的顺序存储结构中,实现串操作的原操作为“字符序列的复制”,操作的时间复杂度基于字符序列的长度。
二、串的堆分配存储表示堆分配存储类似于线性表的顺序存储结构,仍以一组地址连续的存储单元存储串值的字符序列,但它们的存储空间是在程序执行过程中动态分配而得的。
在C语言中是由动态分配函数malloc 和free 来管理一个称之为“堆(heap)”的自由存储区的。
该存储结构类型描述如下: typedef struct char *ch ; // 若是非空串,则按串长分配存储区,//否则ch为NULL int length; // 串长度一个串值的确定是通过串在堆中的起始位置和串的长度实现的。
HString; 这类串操作实现的算法为: 先为新生成的串(若该串已存在,则先释放其所占空间)分配一个长度适当的存储空间,然后进行串值的复制。
这种存储结构表示时的串操作仍基于“字符序列的复制”进行的。
为此,串名与串值之间要建立一个对照表。
0 1 2 3 4 5 6 7 8 9 HString a,b ; 42012 b 4 2000 a 长度 ??length 基址 ??ch 串名 k o o B e r u t c u r t S a t a D ……16 2000+串插入算法 Status StrInsert Hstring &S, intpos, Hstring T //在串S的第pos个字符之前插入串T S.ch 0 1 pos-1 T.length if pos 1 || pos S.length+1 return ERROR; ifT.length //T非空,则重新分配空间,插入T if ! S.ch char * ralloc S.ch , S.length +T.length *sizeof char exitOVERELOW ; for i S.length-1;i pos - 1;--i //插入T而腾出位置 S.ch[i +T.length] S.ch[i] ; S.ch[pos - 1.. pos+T.length - 2] T.ch[0.. T.length - 1]; //插入TS.length + T.length; return OK ; Status StrAssignHString &T,char *chars //生成一个其值等于串常量chars的串T if T.ch free T.ch ; //若串T已存在,释放其所占空间 for i0, c chars ; c ; ++i, ++c ; if ! i T.ch null; T.length 0;else if ! T.ch char * malloc i*sizeof charexit OVERFLOW ; T.ch[0..i-1] chars[0..i-1]; T.lengthi; return OK ; int StrLength HString s return s.length; int StrCmpare HString S , HString T for i 0; i S.length && iT.length; ++i if S.ch[i]! T.ch[i] returnS.ch[i] -T.ch[i] ; return S.length-T.length;Status ClearString HString &S if S.ch free S.ch ; s.ch null;S.length 0; return OK; Status Concat HString &T,HString S1, HString S2 // 用T返回由S1和S2联接而成的新串 if T.ch free T.ch ; // 释放旧空间 if ! T.ch char * malloc S1.length+S2.length *sizeof char exit OVERFLOW ; T.ch[0..S1.length-1] S1.ch[0..S1.length-1];T.length S1.length + S2.length; T.ch[S1.length..T.length-1]S2.ch[0..S2.length-1]; return OK; // Concat Status SubStringHString &Sub, HString S, int pos, int len if pos 1 || posS.length || len 0 || len S.length-pos+1 return ERROR; if Sub.ch free Sub.ch ; // 释放旧空间 if ! len Sub.ch NULL; Sub.length 0; //空子串 else // 完整子串 Sub.ch char * malloc len*sizeof char ; Sub.ch[0..len-1] S[pos-1..pos+len-2];Sub.length len; return OK; // SubString 三、串的块链存储表示?? 可采用链表方式存储串值,每个结点可以存放一个字符,也可以存放多个字符(如图所示)。
第04章-串

1、typedef char * string; //c中旳串相 当于此类型定义
2、typedef struct
{ char *ch;
int length;
}hstring;
数据结构
4.2.3 串旳块链存储构造 链式存储构造类似线性链表,但需要考虑每个结 点是存储一种字符还是多种字符。一种字符旳, 插入、删除、求长度非常以便,但存储效率低。 多种字符旳,改善了效率,在处理大字符串时很 有效,可用特殊符号来填满未充分利用旳结点, 但插入、删除不以便。 附设了头尾指针,并给出了目前串旳长度旳串旳 链式存储构造称为块链存储构造。(参见P78类 型定义)
《 数据构造》
第四章
第四章 串
4.1 串类型旳定义 4.2 串旳表达和实现
4.2.1 定长顺序存储表达 4.2.2 堆分配存储表达 4.2.3 串旳块链存储表达 4.3 串旳模式匹配算法
数据结构
4.1 串类型旳定义
数据结构
一、串和基本概念
串(String)是零个或多种字符构成旳有限序列。一 般记作S=‘a1a2a3…an’,其中S 是串名,双引 号括起来旳字符序列是串值;ai(1≦i≦n)能够是字 母、数字或其他字符;串中所包括旳字符个数称 为该串旳长度。长度为零旳串称为空串,它不包 括任何字符。
串长度旳表达措施:
措施1:用下标为0旳元素存储串长度。
措施2:使用一种不会出目前串中旳特殊字符在串 值旳尾部来表达串旳结束。例如,C语言中以字符 ‵\0′表达串值旳终止。
4.2.2堆分配存储表达
数据结构
这种存储表达旳特点是,仍以一组地址连续旳存储 单元存储串值字符序列,但它们旳存储空间是在程 序执行过程中动态分配而得。所以也称为动态存储 分配旳顺序表。在C语言中利用函数malloc()、 free()来根据实际需要动态分配和释放字符数组空 间。这么定义旳顺序串类型也有两种形式。
第4章串概论

4.1 串类型的定义
串即字符串,是由零个或多个字符组成的有限序列,是数据 元素为单个字符的特殊线性表。
记为: s =“a1 a2 …….. an ” (n≥0 )
串名 串值(用 “ ” 括起来)
隐含结束符‘\0’ ,即 ASCII码NUL
为何要单独讨论“串”类型?
1) 字符串操作比其他数据类型更复杂(如拷贝、连接操作) 2) 程序设计中,处理对象很多都是串类型。
③ 空串是哪个串的子串? a是不是自己的子串? “空串是任意串的子串;任意串S都是S本身的子串,除S本身 外,S的其他子串称为S的真子串。”
5
复习:C语言中常用的串运算
注:用C处理字符串时,要调用标准库函数 #include<string.h>
串比较:int strcmp(char *s1,char *s2); 求串长:int strlen(char *s); 串连接:char strcat(char *to,char *from) 子串T定位:char strchr(char *s,char *c);
{ if(pos<1 || pos>S[0] || len<0 || len>S[0]-pos+1) return ERROR;
//若pos和len参数越界,则告警
第4章 串(String)
4.1 串类型的定义 4.2 串的表示和实现 4.3 串的模式匹配算法
1
主要内容
逻辑结构 s = “a1a2 ……..an ”
定长顺序存储结构
串 存储结构 堆存储结构
块链存储结构 操作(或运算) 若干函数的实现
模式匹配算法
模式匹配即子串定位运算,即如何实现 Index(S,T,pos)函数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if (S1[0]+S2[0] <= MAXSTRLEN) { // 未截断
T[1...S1[0]] = S1[1...S1[0]]; T[S1[0]+1…S1[0]+S2[0]] = S2[1…S2[0]]; T[0] = S1[0]+S2[0]; uncut = TRUE; }
T[0..MAXSTRLEN] = S1[0..MAXSTRLEN];
// T[0] == S1[0] == MAXSTRLEN
uncut = FALSE;
}
return uncut; } // Concat
13
4.2.1 定长顺序存储表示 子串的删除算法
第4章 串
Status StrDelete (SSstring &S, int pos, int len) { if (pos<1 || pos>S[0]||len<=0) return error; if (pos+len-1>=S[0]) S[0]=pos-1; else{ for(i=pos+len;i<=S[0];i++) {S[i-len]=S[i]; } S[0]=S[0]-len; } return OK;
#define MAXSTRLEN 255 // 用户可在255以内定义最大串长
typedef unsigned char Sstring[MAXSTRLEN+1]; // 0号单元存放串的长度
Sstring S;
10
பைடு நூலகம்
4.2.1 定长顺序存储表示 串的连接算法
第4章 串
Status Concat(SString S1, SString S2, SString &T) { // 用T返回由S1和S2联接而成的新串。若未截断,
5
4.1 串类型的定义 串的ADT定义
第4章 串
ADT String { 数据对象:D={ ai |ai∈CharacterSet,i=1,2,...,n, n≥0 } 数据关系: R1={ < ai-1, ai > | ai-1, ai ∈D, i=2,...,n }
基本操作: 见下页
} ADT String
6
4.1 串类型的定义 基本操作:
第4章 串
StrAssign (&T, chars) //根据串常量chars生成串T
DestroyString(&S) //销毁串S
StrCopy (&T, S)
//把串S中内容拷贝到T串
StrLength(S)
//求串长
StrCompare (S, T) //比较串S和T Concat (&T, S1, S2) //连接串
StrInsert (&S, pos, T)
//插入子串
StrDelete (&S, pos, len) //删除子串
8
第4章 串
4.2 串的表示和实现
4.2.1、定长顺序存储表示 4.2.2、堆分配存储表示 4.2.3、串的块链存储表示
9
4.2.1 定长顺序存储表示 串的顺序存储C语言实现
第4章 串
的值。
串的有关术语
(1) 串的长度:串中字符的数目n。 (2) 空串(Null string):长度为零的串。 (3) 子串:串中任意个连续的字符组成的子序列。
3
4.1 串类型的定义
第4章 串
串的有关术语
(4) 主串 包含子串的串相应地称为主串。
(5) 串相等 只有当两个串的长度相等,并且各个对应位置的
StrEmpty (S)
//判断串是否空
7
4.1 串类型的定义 基本操作:
第4章 串
SubString (&Sub, S, pos, len) //求子串
ClearString (&S)
//清空串S
Index (S, T, pos)
//子串定位
Replace (&S, T, V)
//把串S中符合T的子串替换
}
14
第4章 串
4.2 串的表示和实现
4.2.1、定长顺序存储表示 4.2.2、堆分配存储表示 4.2.3、串的块链存储表示
15
4.2.2 堆分配存储表示 堆分配存储表示的C语言实现
第4章 串
typedef struct {
………………. return uncut; } // Concat
11
4.2.1 定长顺序存储表示 串的连接算法
第4章 串
Status Concat(SString S1, SString S2, SString &T) { // 用T返回由S1和S2联接而成的新串。若未截断,
则返回TRUE,否则FALSE。 ……………….
12
4.2.1 定长顺序存储表示 串的连接算法
第4章 串
Status Concat(SString S1, SString S2, SString &T) { // 用T返回由S1和S2联接而成的新串。若未截断,
则返回TRUE,否则FALSE。
………………. else { // 截断(仅取S1)
第4章 串
本章重点难点
重点: (1)ADT串的设计、实现方法和基本操作;
(2)串的简单模式匹配算法,KMP算法。
难点:串的模式匹配算法中的KMP算法。
1
第4章 串
4.1 串类型的定义 4.2 串的表示和实现 4.3 串的模式匹配算法
2
4.1 串类型的定义
第4章 串
串(String)的定义 串是由零个或多个字符组成的有限序列。 记为:s=”a1a2…an” (n≥0) 其中,s是串的名,用双引号括起来的字符序列是串
字符都相等,称两串相等。 (6) 空格串(空白串)(blank string) 由一个或多个空格组成的串。要和“空串”区别,
空格串有长度就是空格的个数。
4
4.1 串类型的定义 串与一般线性表的区别
第4章 串
(1) 串数据对象约束为字符集。
(2) 基本操作的对象不同,线性表以“单个元 素”为操作对象;串以“串的整体”为操作对象, 操作的一般都是子串。
else if (S1[0] <MAXSTRSIZE) { // 截断
T[1..S1[0]] = S1[1..S1[0]];
T[S1[0]+1…MAXSTRLEN] = S2[1…MAXSTRLEN-S1[0]];
T[0] = MAXSTRLEN; uncut = FALSE; }
return uncut; } // Concat