数据结构经典课件 第4章 字符串
合集下载
数据结构-第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 串的类型定义
子串的序号:将子串在主串中首次出现时的该 子串的首字符对应在主串中的序号,称为子串 在主串中的序号(或位置)。 【例】 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)代表单个字符,可以是字母、 数字或其它字符(包括空白符)。 串值:双引号括起来的字符序列。双引号不是 串的内容,只起标识作用。
数据结构第四章串ppt
昌
顺序存储结构
大
链接存储结构
学
索引存储结构
科
技 学
不讲
院
6
4.2.1 串的顺序存储结构
南• 1.顺序存储的类型定义
昌• 顺序串的类型定义与顺序表的定义相似,可以用一个字符
大 型数组和一个整型变量表示,其中字符数组存储串,整型
学 变量表示串的长度。
科 技•
如串S=“Beijing”,字符串从S.ch[0]单元开始存放,用‘\0’
{ p=(linkstring *)malloc(LEN); p->data=t[k++];
y->next=p; y=p;}
y->next=NULL; return(s);
}/* L_STRASSIGN */
26
(2)求链串长度函数L_strlen(head):求带头结点 链串head的长度。
南 昌
图4-2
十分浪费。
8
4.2.1 串的顺序存储结构
• (2)紧凑存储。同样存
南 昌
储S="Hello boy",用紧
大 凑格式一个地址能存四
学 个字符,如图5-3所示。 科 技 紧凑存储的优点是空间
学 利用率高,缺点是对串
院 中字符处理的效率低。
存储地址 1000 1001 1002 1003
字长为4
}/* S_STRLEN */
22
(3)顺序串的比较函数S_strcmp(s1, s2):比较两个顺序串的 大小。若s1=s2,则函数返回0;若s1>s2,则函数返回正数; 若s1<s2,则函数返回负数。
/* 两个顺序串比较函数,函数返回值为0、正数或负数 */
数据结构部分PPT课件
1
数据结构
串中任意个连续字符组成的子序列称为该串的子串,包含子 串的串相应地称为主串。通常将子串在主串中首次出现时的 该子串的首字符对应的主串中的序号,定义为子串在主串中 的序号(或位置)。例如:a,b,c,d 四个字符串为
a=‘BEI’
, b=‘JING’
c=‘BEIJING’ , d=‘BEI JING’
StrCompare(S,T);
StrLength(S);
ClearString(&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);
ADT String {
数据对象:D = {ai | ai∈CharacteSet,i=1,2,...n, n>=0} 数据关系: R1= {< ai-1., ai>| ai∈D, i=2,...n}。
基本操作:
StrAssign(&T,chars); StrCopy(&T,S);
StrEmpty (S);
它们的长度分别为 3,4,7,8;a和b都是c和d的子串。a在c和d 中的位置都是1,b在c中的位置是4,而b在d中的位置是5。
注意:单引号是为字符串区别于变量名而设,它不是字符串的 内容
称两个串是相等的 当且仅当这两个串每个字符对应相等
2
数据结构
二、串的抽象数据定义
串的抽象数据类型定义见书P71
第四章 串
4.1 串类型的定义
第4章 串 数据结构课件
saaaaabaaabsaaaaab设匹配成功发生在设匹配成功发生在sisi处则在处则在ii11趟不成功的匹配中共趟不成功的匹配中共比较了比较了ii11mm次第次第ii趟成功的匹配共比较了趟成功的匹配共比较了mm次所以总共比较了所以总共比较了iimm次因此平均比较的次数是次因此平均比较的次数是一般情况下一般情况下mnmn因此最坏情况下的时间复杂度是因此最坏情况下的时间复杂度是onmonm
):从主串 的第pos个字符起定 (10)子串定位 )子串定位StrIndex(s,t,pos):从主串 的第 个字符起定 ( , , ):从主串s的第 位串s中是否存在和串 值相等的子串,若存在,则返回子串t在主串 中是否存在和串t值相等的子串 在主串s中 位串 中是否存在和串 值相等的子串,若存在,则返回子串 在主串 中 第一次出现的位置,否则,返回函数值0。 第一次出现的位置,否则,返回函数值 。 例如, 例如, StrIndex(“Beijing”,“jin”,1)=4; ( , , ) ; StrIndex(“Beijing”,“jng”,2)=0 ( , , ) ):用 串置换s串中第 (11)置换运算 )置换运算StrReplace(s,pos,len,t):用t串置换 串中第 ( , , , ): 串置换 pos字符开始的连续的 个字符。 字符开始的连续的len个字符 字符开始的连续的 个字符。 例如,s=“Thatфisфaфbag!”,则 例如, ! StrReplace(s,3,2,“is”)=“Thisфisфaфbag!” (, , , )=“ )= ! 有时用另一种置换运算StrReplace(s,t,v)表示用 串置换所有在 ( , , )表示用v串置换所有在 有时用另一种置换运算 s串中出现的与 串相等的子串。 串中出现的与t串相等的子串 串中出现的与 串相等的子串。 例如, ++;” 例如,s=“if(j<n)ф j++;”,t=“j”,v=“i”,则 ( ) ++; , , StrReplace(s,t,v)=“if(i<n)ф i++;” (,, ) ++;” ( ) ++; 以上介绍的是有关串的一些基本运算, 以上介绍的是有关串的一些基本运算,利用它们可以处理关于串的 各种操作,在使用高级程序设计语言中的串类型时, 各种操作,在使用高级程序设计语言中的串类型时,对于串的基本运算 可以有不同的定义方法。 可以有不同的定义方法。
):从主串 的第pos个字符起定 (10)子串定位 )子串定位StrIndex(s,t,pos):从主串 的第 个字符起定 ( , , ):从主串s的第 位串s中是否存在和串 值相等的子串,若存在,则返回子串t在主串 中是否存在和串t值相等的子串 在主串s中 位串 中是否存在和串 值相等的子串,若存在,则返回子串 在主串 中 第一次出现的位置,否则,返回函数值0。 第一次出现的位置,否则,返回函数值 。 例如, 例如, StrIndex(“Beijing”,“jin”,1)=4; ( , , ) ; StrIndex(“Beijing”,“jng”,2)=0 ( , , ) ):用 串置换s串中第 (11)置换运算 )置换运算StrReplace(s,pos,len,t):用t串置换 串中第 ( , , , ): 串置换 pos字符开始的连续的 个字符。 字符开始的连续的len个字符 字符开始的连续的 个字符。 例如,s=“Thatфisфaфbag!”,则 例如, ! StrReplace(s,3,2,“is”)=“Thisфisфaфbag!” (, , , )=“ )= ! 有时用另一种置换运算StrReplace(s,t,v)表示用 串置换所有在 ( , , )表示用v串置换所有在 有时用另一种置换运算 s串中出现的与 串相等的子串。 串中出现的与t串相等的子串 串中出现的与 串相等的子串。 例如, ++;” 例如,s=“if(j<n)ф j++;”,t=“j”,v=“i”,则 ( ) ++; , , StrReplace(s,t,v)=“if(i<n)ф i++;” (,, ) ++;” ( ) ++; 以上介绍的是有关串的一些基本运算, 以上介绍的是有关串的一些基本运算,利用它们可以处理关于串的 各种操作,在使用高级程序设计语言中的串类型时, 各种操作,在使用高级程序设计语言中的串类型时,对于串的基本运算 可以有不同的定义方法。 可以有不同的定义方法。
数据结构第4章PPT课件
• (12)StrReplace(S,T,pos,len):串替换操作。当1≤pos≤StrLength(S)且0≤len≤StrLength(S)pos+1时,用串T替换串S中从第pos个字符开始的len个字符。
• (13)StrDestroy(S):串销毁操作。销毁串S。
10
第10页/共33页
4.2 串的存储结构
4.1 串的定义及基本操作
• 串即字符串,计算机处理的对象分为数值数据和非数值数据,字符串是最基本的非数值数据。 • 字符串的应用非常广泛,它是许多软件系统(如字符编辑、情报检索、词法分析、符号处理、自然语言翻译
等系统)的操作对象。 • 在事务处理程序中,顾客的姓名和地址以及货物的名称、产地和规格等一般也是作为字符串处理的。字符
• 线性表的顺序和链式存储结构对于串都是适用的。但任何一种存储结构对于串的不同运 算并非都是十分有效的。
• 对于串的插入和删除操作,顺序存储结构是不方便的,而链式存储结构则显得方便些。 如果访问串中单个字符,对链表来说是不困难的;当要访问一组连续的字符时,用链式 存储结构要比用顺序存储结构麻烦。
11
9
第9页/共33页
串的基本操作
• (10)SubString(Sub,S,pos,len):求子串操作。若存在位置1≤pos≤StrLength(S)且 1≤len≤StrLength(S)-pos+1,则用Sub返回串S的第pos个字符起长度为len的子串。
• (11)StrIndex(S,T):串定位操作。若串S中存在和串T相同的子串,则返回它在串S中第一次出现的位 置;否则返回0。
•
同样存储S="
String Structure",用
紧凑格式一个地址能存四
• (13)StrDestroy(S):串销毁操作。销毁串S。
10
第10页/共33页
4.2 串的存储结构
4.1 串的定义及基本操作
• 串即字符串,计算机处理的对象分为数值数据和非数值数据,字符串是最基本的非数值数据。 • 字符串的应用非常广泛,它是许多软件系统(如字符编辑、情报检索、词法分析、符号处理、自然语言翻译
等系统)的操作对象。 • 在事务处理程序中,顾客的姓名和地址以及货物的名称、产地和规格等一般也是作为字符串处理的。字符
• 线性表的顺序和链式存储结构对于串都是适用的。但任何一种存储结构对于串的不同运 算并非都是十分有效的。
• 对于串的插入和删除操作,顺序存储结构是不方便的,而链式存储结构则显得方便些。 如果访问串中单个字符,对链表来说是不困难的;当要访问一组连续的字符时,用链式 存储结构要比用顺序存储结构麻烦。
11
9
第9页/共33页
串的基本操作
• (10)SubString(Sub,S,pos,len):求子串操作。若存在位置1≤pos≤StrLength(S)且 1≤len≤StrLength(S)-pos+1,则用Sub返回串S的第pos个字符起长度为len的子串。
• (11)StrIndex(S,T):串定位操作。若串S中存在和串T相同的子串,则返回它在串S中第一次出现的位 置;否则返回0。
•
同样存储S="
String Structure",用
紧凑格式一个地址能存四
数据结构课件 第四章 串和数组
else {
s->str=(char*)malloc((len+1)*sizeof(char));
//分配空间
if (!s->str) return ERROR;
s->str[0..len]=string_constant[0..len];
//对应的字符赋值
s->length=len;
//赋予字符串长度
串的抽象数据类型定义
functions:
// 有13种之多
StrAssign(&T, chars) // 串赋值,生成值为chars的串T
StrCompare(S,T)
// 串比较,若S>T,返回值大于0…
StrLength(S)
// 求串长,即返回S的元素个数
Concat(&T, S1, S2) // 串连接,用T返回S1+S2的新串
type unsigned char String[MAX_STRING];
第二种是在程序执行过程中,利用标准函数malloc和free动态
地分配或释放存储字符串的存储单元,并以一个特殊的字符作为字符串
的结束标志,它的好处在于:可以根据具体情况,灵活地申请适当数目
的存储空间,从而提高存储资源的利用率。类型定义如下所示:
(4)串连接 int Concat(STRING *s1,STRING s2) { STRING s; StringAssign(&s,s1->str); //将s1原来的内容保留在s中 len=Length(s1)+Length(s2); //计算s1和s2的长度之和 free(s1->str); //释放s1原来占据的空间 s1->str=(char*)malloc((len+1)*sizeof(char)); //重新为s1分配空间
精品课件-数据结构实用教程(C语言版)-第四章 串
; commander
, 4, 3) , 1, 9) , 9, 1)
r 长度为 0 的子串——空串,为“合法”串
Index (S, T, pos) (子串的定位函数) 初始条件:串S和T存在,T是非空串,
1≤pos≤StrLength(S)。 操作结果: 若主串 S 中存在和串 T 值相同
的子串, 则返回它在主串 S 中第pos个 字符之后第一次出现的位置; 否则函数值为0。
char s[MAXSIZE]; 0 1 2 3 4 5 6 7 8 9 10 …
a b c d e f g h i j k \0
MAXSIZE-1 …
3. 讨论顺序串中定长串连接的基本运算。
串连接:把两个串S1和S2首尾连接成一个新串S,即 S≤S1+S2。
实现串的运算时,其基本操作为“字符序列的复制”。 下面以串连接为例讨论之,串的连接算法中需分三种情况处理,
插入串T。
例如: S = chater ,T = rac , 则执行 StrInsert(S, 4, T)之后得到 S = character
StrDelete (&S, pos, len)
初始条件:串S存在 1≤pos≤StrLength(S)-len+1。
操作结果:从串S中删除第pos个字符 起长度为len的子串。
int curlen; } SeqString; 定义一个串变量:SeqString s; 这种存储方式可以直接得到串的长度:s.curlen+1 如图
s.data 0 1 2 3 4 5 6 7 8 9 10 … abcdefgh i j k
s.curlen
MAXSIZE-1 …
(2) 在串尾存储一个不会在串中出现的特殊字符作为串的终结符 ,以此表示串的结尾。比如C语言中处理定长串的方法就是这样, 它是用‘\0’来表示串的结束,如图所示。 这种存储方法不能直接得到串的长度,而是用判断当前字符是否 是‘\0’来确定串是否结束,从而求得串的长度。此时的串长为 隐含值,有时不便于进行某些操作。
第4章字符串
第1章概论
目录 1. 数据结构概述 2. 什么是数据结构 3. 算法
1.1 数据结构概述
二十世纪四十年代,电子数字计算机问世就是解 决复杂的计算问题。早期,电子计算机的应用范围, 也只局限于科学和工程的计算,其处理的对象是纯数 值性的信息,通常,人们把这类问题称为数值计算。
随着计算机科学技术的迅猛发展,计算机的应用已从 传统的数值计算领域发展到各种非数值计算领域。当 前,计算机已广泛地应用于情报检索、企业管理、系 统工程等各个领域;与此相应,计算机的处理对象也 从简单的纯数值性数据发展到一般的符号和具有一定 结构的数据。
1.3. 3 算法的描述
设计一个算法后,要对它进行描述,可以用自然语言、 数字语言或约定的符号来描述,也可以用计算机高级程 序语言来描述。
我们用C++语言描述数据结构及算法;对每种数据结构 先用抽象数据类型(ADT)简单给出这种数据结构的定 义及基本运算,并用类C语言讲解一些典型的基本运算( 操作),在每章的末尾用C++的类声明给出该数据结构 的数据及操作(接口部分),并且给出典型操作的实现 代码(经过调试的算法);ADT是在概念层上描述问题 ;类是在实现层上描述问题;在应用层上操作对象(类 的实例)解决问题。
MatrixMult的渐近时间复杂度。
记号“O”是数学符号,其严格的数学定义是:
若T(n)和f (n)是定义在正整数集合上的两个 函数,当存在两个正的常数c和n0,使得对所有 的n≥n0,都有T(n)≤cf(n)成立,则T(n)=O(f(n))。
当我们评价一个算法的时间性能时,主要标 准是算法时间复杂度的数量级,即算法的渐近 时间复杂度。
1.3 算法
算法与数据结构密切相关,因为数据 的运算是通过算法描述的,算法就是解决 问题的策略、规则与方法。所以讨论算法 是数据结构课程的重要内容之一。
目录 1. 数据结构概述 2. 什么是数据结构 3. 算法
1.1 数据结构概述
二十世纪四十年代,电子数字计算机问世就是解 决复杂的计算问题。早期,电子计算机的应用范围, 也只局限于科学和工程的计算,其处理的对象是纯数 值性的信息,通常,人们把这类问题称为数值计算。
随着计算机科学技术的迅猛发展,计算机的应用已从 传统的数值计算领域发展到各种非数值计算领域。当 前,计算机已广泛地应用于情报检索、企业管理、系 统工程等各个领域;与此相应,计算机的处理对象也 从简单的纯数值性数据发展到一般的符号和具有一定 结构的数据。
1.3. 3 算法的描述
设计一个算法后,要对它进行描述,可以用自然语言、 数字语言或约定的符号来描述,也可以用计算机高级程 序语言来描述。
我们用C++语言描述数据结构及算法;对每种数据结构 先用抽象数据类型(ADT)简单给出这种数据结构的定 义及基本运算,并用类C语言讲解一些典型的基本运算( 操作),在每章的末尾用C++的类声明给出该数据结构 的数据及操作(接口部分),并且给出典型操作的实现 代码(经过调试的算法);ADT是在概念层上描述问题 ;类是在实现层上描述问题;在应用层上操作对象(类 的实例)解决问题。
MatrixMult的渐近时间复杂度。
记号“O”是数学符号,其严格的数学定义是:
若T(n)和f (n)是定义在正整数集合上的两个 函数,当存在两个正的常数c和n0,使得对所有 的n≥n0,都有T(n)≤cf(n)成立,则T(n)=O(f(n))。
当我们评价一个算法的时间性能时,主要标 准是算法时间复杂度的数量级,即算法的渐近 时间复杂度。
1.3 算法
算法与数据结构密切相关,因为数据 的运算是通过算法描述的,算法就是解决 问题的策略、规则与方法。所以讨论算法 是数据结构课程的重要内容之一。
数据结构课件 第4章 串
Data Structure
2019/8/22
Page 5
由串相等引出:串的比较
串的比较:通过组成串的字符之间的比较来进行的。
给定两个串:X="x1x2…xn"和Y="y1y2…ym",则: 1. 当n=m且x1=y1,…,xn=ym时,称X=Y; 2. 当下列条件之一成立时,称X<Y: ⑴ n<m且xi=yi(1≤ i≤n); ⑵存在k≤min(m,n),使得xi=yi(1≤i≤k-1)且xk<yk。 例:S1="ab12cd ",S2="ab12",S3="ab13"
i = 2, len = 3
abcdefge
i = 6, len = 4
abcdefge
空串
cde
ge
Data Structure
2019/8/22
Page 20
求子串
Status SubString (SString &Sub,SString S,int pos,int len ){
//以Sub带回串S中第pos个字符起长度为len的子串 //其中,1≤pos≤StrLength(S) 且0≤len≤StrLength(S)-pos+1
串值必须用一 对单引号括起 来
串值:用单引号括起来的字符序列。
长度:串中字符的数目。 空串:含零个字符的串,表示。
空串与空格 串的区别?
空格串:由一个或多个空格组成的串。
子串:串中任意个连续的字符组成的子序列。
字符在串的位置:字符在序列中的序号。
子串在串的位置:子串的第一个字符在串中的位置。
Data Structure
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
改进办法3
每当一趟匹配过程中出现字符不相等时, 不回溯 j 指针,而是利用已经得到的部分 匹配结果将模式向右滑动一段距离。 j=2
j=6
ababcabcacbab abcac
i=4
ababcabcacbab
abc
ababcabcacbab abcac i=5
j=10
i=2
子串:a b c a c
next函数
s3 s2 s1
char s1[12] ="Hello world"; char s2[8]="2009"; char s3[6]="";
H
0
e
1
l
2
l
3
0
4 5
w
6
o
d \0
10 11
2
0
0
1
0
2
9
3
\0
4 5 6 7
\0
0 1 2 3 4 5
4.2.2 字符串类String的存储结构
String类支持字符串的动态变化。 namespace std { template <class charT, class traits = char_traits <charT>, class Allocator = alocator <charT>> class basic_string { public: ...... 有关字符串的属性 } 都封装在String中 } typedef basic_string <char> String;
时间复杂度
设主串T长度为n,子串P长度为m 最坏情况: 每次比较到P串的第m个字符时不匹 配,则时间复杂度为O(n*m)。
3
改进办法1
如果重新比较时,T中所剩的字符个数 不足子串P时,立即让算法终止。
改进办法2
每次先用子串的第一个字符及最 后一个字符与主串对应的字符进
j
行比较,若均相等,再比较中间 的字符。
1
4.1.3 字符串抽象数据类型
class string { string append(const char c); private: string concatenate(const char* s); ......; public: string copy(const char* s); string(); string insert(const char c, const int index); string(char* s); ~string(); int find(const char c, const int start); int length(); string substr(const int s, const int len); int isEmpty(); void clear(); };
4.3 字符串的模式匹配 主串:s=“babcabcacbab” 模式:t=“bcac”
Index(s,t) = 5
int NaiveStrMatching(const String& T,const String& P) { int i = 0, j = 0; int pLen = P.length(); P.length(); //模式长度 int tLen = T.length(); T.length(); //主串长度 if (tLen (tLen < pLen) pLen) return -1; while (i < pLen && j < tLen) tLen) { if (T[j ] == P[i]) (T[j] P[i]) { i++; j++; } else { j = j – i + 1; 0 1 2 3 4 5 6 7 8 i = 0; * * * * * * * * * } # # # } if (i >= pLen) pLen) return j – pLen +1; +1; else return -1; }
第4章
字符串
4.1 字符串的基本概念
4.1.1 字符编码 4.1.2 字符的编码顺序 4.1.3 字符串抽象数据类型
4.1 字符串的基本概念 4.2 字符串的存储结构和实现 4.3 字符串的模式匹配
与线性表的区别:
字符串:由0个或多个字符的顺序排列所组成 的复合数据结构,简称“串”。 串的长度:一个字符串所包含的字符个数。 空串:不含任何字符的字符串,长度为零。 字符串的数据元素约束为字符 线性表的基本操作通常以“单个元素” 作为操作对象,而字符串的基本操作 通常以“串整体”作为操作对象
String::String(char *s) { size = strlen(s); str = new char[size + 1]; assert( str != NULL); strcpy(str, s); }
String String::substr(int pos, int n) { int i; int left = size – pos; //查看剩余长度 String tmp; char *p, *q; if (pos>=size) return NULL; if (n>left) n = left; tmp.str = new char[n+1]; assert(tmp.str != NULL); p = tmp.str; q = &str[pos]; for (i = 0; i < n; i++) *p++ = *q++; *p = '\0'; tmp.size = n; return tmp; }
C++字符串的操作列表
substr( ) swap( ) copy( ) assign( ) = insert( ) += append( ) + find( ) replace( ) clear( ) size( ) length( ) max_size( ) 返回一个字符串的子串 交换两个字符串的内容 复制字符串 将一个字符串赋给另外一个字符串 与assign() 将一个字符或字符串插入到给定位置 将一个字符或字符串追加在另一个字符串后 将一个字符或字符串追加在另一个字符串后 将一个字符串连接在另一个字符串之后 查找并返回子序列的开始位置 替换字符或字符串 清空字符串 返回字符串中的字符个数 返回字符串长度 返回字符串允许的最大长度
4.1.1 字符编码
字符(char) :组成字符串的基本单位。 在C/C++中,字符采用 单字节(8 bits)表示 ASCII码对128个符号进行编码
4.1.2 字符的编码顺序
为了便于字符串的比较和运算,字符 编码表一般遵循约定俗成的“偏序编 码规则”。 字符偏序:根据字符的自然含义,某 些字符间具有一定的次序,在大多数 情况下就是字典序。
尽管时间复杂度为O(m*n), 但接近O(m+n)。
i: 0 1 2 3 4 5 6 7
模式串: next(i) :
abaabcac
-1 0 0 1 1 2 0 1
本章作业
习题
5,6,8
5
2
4.2.3 字符串运算的实现
int strcmp(const char *s1, const char *s2) { int i=0; while (s1[i] !='\0' &&s2[i]!='\0') { if (s1[i]>s2[i]) return 1; else if (s1[i]<s2[i]) return -1; i++; } if (s1[i]=='\0' && s2[i]!='\0') return -1; else if (s2[i]=='\0' && s1[i]!='\0') return 1; return 0; }
4.2 字符串的存储结构和实现
字符串的顺序存储 字符串类class String的存储结构
4.2.1
字符串的顺序存储
如果串长变化不大,可以有三种处理方案: (1)用S[0]作为记录串长的存储单元。 缺点:限制了串的最大长度不能超过256。 (2)为存储串的长度,另辟一个存储的地方。 缺点:串的最大长度是静态的,而不是动态的。 (3)用一个特殊的末尾标记'\0'。 例如:C/C++语言采用这种方法。
当模式串中第i个字符与主串中相应字 符不相等时,在模式中需用第几个 字符与主串的该字符(第j个字符)比较。
next函数
-1, next[i]=
当i=0时
Max{k|0<k<i且 p0..pk-1==p i-k...p i-1} 该集合不空 0 其它
4
int KMPStrMatching(const String &T,const String &P,int *N) { int i=0, j=0; int pLen=P.length(); //模式长度 int tLen=T.length(); //主串长度 if (tLen<pLen) return -1; while (i<pLen&&j<tLen){ if (i==-1||P[i]==T[j]) {i++;j++;} else i=N[i]; } if (i>=pLen]) return (j-pLen+1); else return -1; }