第四章串的模式匹配

合集下载

数据结构串串的基本概念串的存储结构与实现串的模式匹配

数据结构串串的基本概念串的存储结构与实现串的模式匹配
t.ch[i]=s1.ch[i]; for(i=s1.length;i<t.length;i++)
t.ch[i]=s2.ch[i-s1.length]; }
串删除
void strdelete(Hstring &s,int pos,int len) {
if(pos<1||pos>s.length-len+1||len<0||len>s.length){ cout<<"删除位置不合法"<<endl; return;
int flag=0; int i=0,j=1; if(s1[0]+s2[0]<=MAXSTRLEN) {
for(i=1;i<=s1[0];i++) t[i]=s1[i];
for(i=s1[0]+1;i<=s1[0]+s2[0];i++) t[i]=s2[j++];
t[0]=s1[0]+s2[0]; flag=1; //未截断 }
strempty(s) 初始条件:s为一个串 操作结果:若s为空串,则返回1
strcopy(&t,s) 初始条件:s为一个串 操作结果:把串s复制给t
strncpy(&sub,s,pos,len) 初始条件:s为一个串,pos为起始位置, 1≤pos≤strlength(s)-1,len≥0 操作结果:用sub返回串s的第pos个字符开⑩长度为len的子串
例:模式串t=“abcac”和主串s=“ababcabcaccabbc”匹配过程
第三二一 趟 a b a b c a b c a c c a b b c i=112734568901

KMP算法(原创)PPT教学课件

KMP算法(原创)PPT教学课件

? 这时如何求next[j+1]呢
2020/12/10
11
转化法
式1的结论可这样描述:何时的k使得
pk=pj,就用此时的k代入式1。
而现在的k是pk!=pj,因此必须要换成另外 一个“k”,并设它为k2,以使得pk2=pj。
问题又出来了: k2如何得来?
如图: 0 j-k+1
j
P’
2/10
2
(2) Brute-Force算法的实现
int String::Find Substr(const String& t, int start)const {
int i = start, j = 0, v; while(i < size && j < t.size) {
if(str[i] == t.str[j]) {i++;j++;} else {i = i-j+1;j = 0;} } if(j >= t.size-1) v = i-t.size+1; else v = -1; return v; }
由(1)(2)两式便可得:
‘p0p1……pk-1’= ‘pj-kpj-k+1……pj-1’ (3) (3)式的结论可如下描述:
在模式p中,前k个字符与第j个字符之前 的k个字符相同。
2020/12/10
7
设next[j]表示:当模式中第j个字符与正 文中相应字符“失配”时,在模式中重 新和正文中该字符进行比较的字符的位 置。
利用next数组进行模式匹配示例:
2020/12/10
9
如何预先求得next数组值
首先要明确一点: next数组的求值只与 模式p有关,而与具体的正文s无关。

串的模式匹配算法

串的模式匹配算法

串串(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.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. 在串尾存储一个不会在串中出现的特殊字符作为串的终结符,以此表示串的结尾。

数据结构第四章资料

数据结构第四章资料

设数组开始存放位置 LOC( 0, 0 ) = a LOC ( j, k ) = a + j * m + k
三维数组
按页/行/列存放,页优先的顺序存储
u1

u3
l1 l2 l3
u2
② ③
三维数组
a[m1][m2] [m3] 各维元素个数为
m1, m 2, m3
下标为 i1, i2, i3的数组元素的存储位置:
KMP(Knuth Morris Pratt)算法(一般理解)
《计算机程序设计艺术 第1卷 基本算法》 《计算机程序设计艺术 第2卷 半数值算法》 《计算机程序设计艺术 第3卷 排序与查找》
/~knuth/
KMP算法设计思想
利用已经部分匹配的结果而加快模式串的滑动速度? 且主串S的指针i不必回溯!可提速到O(n+m)!
基本操作:
(1) InitArray (&A,n,bound1, boundn) //构造数组A (2) DestroyArray (&A) // 销毁数组A (3) Value(A,&e,index1,…,indexn) //取数组元素值 (4) Assign (A,&e,index1,…,indexn) //给数组元素赋值
FORTRAN
二维数组的行序优先表示
a[n][m]
a[0][1] a[0][0] a[1][1] a[1][0] a a[2][0] a[2][1] a[n 1][0] a[n 1][1] a[0][m 1] a[1][m 1] a[2][m 1] a[n 1][m 1]
第4章 串、数组和广义表

串的模式匹配算法

串的模式匹配算法

串的模式匹配算法字符串模式匹配是计算机科学中一种常用的算法。

它是一种检索字符串中特定模式的技术,可以用来在字符串中查找相应的模式,进而完成相应的任务。

字符串模式匹配的基本思想是,用一个模式串pattern去匹配另一个主串text,如果在text中找到和pattern完全匹配的子串,则该子串就是pattern的匹配串。

字符串模式匹配的过程就是在text中搜索所有可能的子串,然后比较它们是否和pattern完全匹配。

字符串模式匹配的算法有很多,其中著名的有暴力匹配算法、KMP算法、BM算法和Sunday算法等。

暴力匹配算法是最简单也是最常用的字符串模式匹配算法,其思想是从主串的某一位置开始,依次比较pattern中每一个字符,如果某个字符不匹配,则从主串的下一位置重新开始匹配。

KMP算法(Knuth-Morris-Pratt算法)是一种更为高效的字符串模式匹配算法,它的特点是利用了已匹配过的字符的信息,使搜索更加有效。

它的实现思想是,在pattern中先建立一个next数组,next数组的值代表pattern中每个字符前面的字符串的最大公共前缀和最大公共后缀的长度,这样可以在主串和模式串匹配失败时,利用next数组跳转到更有可能匹配成功的位置继续搜索,从而提高字符串模式匹配的效率。

BM算法(Boyer-Moore算法)也是一种高效的字符串模式匹配算法,它的实现思想是利用主串中每个字符最后出现的位置信息,以及模式串中每个字符最右出现的位置信息来跳转搜索,从而减少不必要的比较次数,提高搜索效率。

Sunday算法是一种简单而高效的字符串模式匹配算法,它的实现思想是,在主串中搜索时,每次从pattern的最右边开始比较,如果不匹配,则根据主串中下一个字符在pattern中出现的位置,将pattern整体向右移动相应位数,继续比较,这样可以减少不必要的比较次数,提高算法的效率。

字符串模式匹配算法的应用非常广泛,它可以用来查找文本中的关键字,检查一个字符串是否以另一个字符串开头或结尾,查找文本中的模式,查找拼写错误,检查字符串中是否包含特定的字符等。

串PPT课件专题培训

串PPT课件专题培训

例:
1.空串和空格串有无区别? 有区别。空串(Null String)是指长度为零旳串;而空 格串(Blank String)是指包括一种或多种空格旳字符串 .
2.既有下列4个字符串:
a =‘BEI’ b =‘JING’ c = ‘BEIJING’ d = ‘BEI JING’
问:① 他们各自旳长度? ② b是哪个串旳子串?它在主串中旳位置是多少?
T.length =i;
}
return OK;
}//StrAssign
三、链式存储:用链表存储串值,易插入和删除。
Typedef struct { char *ch; // 若非空串,按串长分配空间; 不然 ch = NULL int length; //串长度
}HString
例:用“堆”实现串插入操作(教材P75)
Status StrInsert ( HString &S, int pos, HString T ){
❖ 堆分配存储表达
——用一组地址连续旳存储单元存储串值旳字符 序列,但存储空间是在程序执行过程中动态分配 而得。
链式 存储
❖ 串旳块链存储表达
——链式方式存储
一、定长顺序存储
用一组连续旳存储单元来存储串,直接使用定长旳字符 数组来定义,数组旳上界预先给出,故称为静态存储分 配。
例如: #define MAXSTRLEN 255 //顾客可用旳最大串长 typedef unsigned char SString[MAXSTRLEN+1 ]; SString S; //S是一种可容纳255个字符旳顺序串。
Status Concat(SString &T, SString S1, SString S2,) { // 用T返回由S1和S2联接而成旳新串。若未截断, 则返回TRUE,不然FALSE。

串
初始条件:串S和T存在。 操作结果:若S>T,则返回值>0;若S = T,则返回值=0;若S<T,则返回值<0.
ClearString (&S)
初始条件:串S存在。 操作结果:将S清为空串。
Concat (&T , S1, S2)
初始条件:串S1和S2存在。 操作结果:用T返回由S1和S2联接而成的新串。
Status ClearString(HString &S) { //将S清为空串. if(S.ch) { free(S.ch); S.ch=NULL;} S.length=0; return OK; }// ClearString
Status Concat(HString &T, HString S1, HString S2)
int Strlength(HString S) { return S.length; }
int StrCompare(HString S, HString T) { //若S>T,则返回值>0;若S = T,则返回值=0;若S<T,则返回值<0 for( i=0; i< S.length && i< T.length; ++i ) if(S.ch[i]!= T.ch[i]) return S.ch[i]-T.ch[i]; return S.length- T.length; }
• 二、串的抽象数据类型的定义
ADT String { 数据对象:D={ai| ai∈CharacterSet; i=1,2,…,n,;n≥0} 数据关系:R1={<ai-1, ai>| ai-1, ai∈D; i= 2,…,n} 基本操作: StrAssign (&T , chars)

第四章 串

第四章 串
主串S首次出现的位置;否则返回0
– 例如
• 主串S = • 子串T = CD • 则index(S,T),返回子串T在S中,第一次出现的位置3
19
串的模式匹配
Brute-Force算法基本思想: • 从目标串s 的第一个字符起和模式串t的第一个字符进行比较 • 若相等,则继续逐个比较后续字符,否则从串s 的第二个字 符起再重新和串t进行比较。 • 依此类推,直至串t 中的每个字符依次和串s的一个连续的字 符序列相等,则称模式匹配成功,此时串t的第一个字符在串s 中的位置就是t 在s中的位置,否则模式匹配不成功。
两式联立可得:“T0…Tk-1”= “Tj-k…Tj-1”
注意:j为当前已知的失配位置,我们的目标是计算新起点k。式中仅剩 一个未知数k,理论上已可解!
奇妙的结果:k仅与模式串T有关!
27
新起点k怎么求?
根据模式串T的规律:“T0…Tk-1”=“Tj-k …Tj-1” 由当前失配位置j(已知),归纳计算新起点k的表达式。
j=next[j]的位置(即模式串继续向右移动),再比较 si 和 tj 。
依次类推,直到下列两种情况之一: 1)j退回到某个j=next[j]时有 si = tj,则指针各增1,继续匹配; 2)j退回至j=0,此时令指针各增1,即下一次比较 si+1和 t0 。
30
串的模式匹配:KMP算法
• 模式串的next函数
6
串的基本概念
4.两个字符串相等的充分必要条件为两个字符串的长度相等,并 且对应位置上的字符相等。
例如:‘abcd’ ≠ ‘bacd’ ‘abcd’ = ‘abcd’
7
串的基本操作
1.给串变量赋值 ASSIGN(S1,S2)

数据结构—串的模式匹配

数据结构—串的模式匹配

数据结构—串的模式匹配数据结构—串的模式匹配1.介绍串的模式匹配是计算机科学中的一个重要问题,用于在一个较长的字符串(称为主串)中查找一个较短的字符串(称为模式串)出现的位置。

本文档将详细介绍串的模式匹配算法及其实现。

2.算法一:暴力匹配法暴力匹配法是最简单直观的一种模式匹配算法,它通过逐个比较主串和模式串的字符进行匹配。

具体步骤如下:1.从主串的第一个字符开始,逐个比较主串和模式串的字符。

2.如果当前字符匹配成功,则比较下一个字符,直到模式串结束或出现不匹配的字符。

3.如果匹配成功,返回当前字符在主串中的位置,否则继续从主串的下一个位置开始匹配。

3.算法二:KMP匹配算法KMP匹配算法是一种改进的模式匹配算法,它通过构建一个部分匹配表来减少不必要的比较次数。

具体步骤如下:1.构建模式串的部分匹配表,即找出模式串中每个字符对应的最长公共前后缀长度。

2.从主串的第一个字符开始,逐个比较主串和模式串的字符。

3.如果当前字符匹配成功,则继续比较下一个字符。

4.如果当前字符不匹配,则根据部分匹配表的值调整模式串的位置,直到模式串移动到合适的位置。

4.算法三:Boyer-Moore匹配算法Boyer-Moore匹配算法是一种高效的模式匹配算法,它通过利用模式串中的字符出现位置和不匹配字符进行跳跃式的匹配。

具体步骤如下:1.构建一个坏字符规则表,记录模式串中每个字符出现的最后一个位置。

2.从主串的第一个字符开始,逐个比较主串和模式串的字符。

3.如果当前字符匹配成功,则继续比较下一个字符。

4.如果当前字符不匹配,则根据坏字符规则表的值调整模式串的位置,使模式串向后滑动。

5.算法四:Rabin-Karp匹配算法Rabin-Karp匹配算法是一种基于哈希算法的模式匹配算法,它通过计算主串和模式串的哈希值进行匹配。

具体步骤如下:1.计算模式串的哈希值。

2.从主串的第一个字符开始,逐个计算主串中与模式串长度相同的子串的哈希值。

串串的模式匹配

串串的模式匹配
文档仅供参考,如有不当之处,请联系改正。
Brute-Force简称为BF算法,亦称简朴匹配算法。采用穷 举旳思绪。
s: a a a a b c d t: a ab bac cab bc c ✓
匹配成功
算法旳思绪是从s旳每一种字符开始依次与t旳字符进行匹配。
1
文档仅供参考,如有不当之处,请联系改正。
j
0
1
2
3
4
t[j]
a
a
a
a
b
next[j] -1
0
1
2
3
01 2 34 5678
s: a a a b a a a a b
i=3 j=1
t: a a a a b
01 23 4
失败:
i=3 j=1,j=next[1]=0
20
文档仅供参考,如有不当之处,请联系改正。
j
0
1
2
3
4
t[j]
a
a
a
a
b
next[j] -1
将s[i]与 将s[i+1]与 t[0]匹配 t[0]匹配
因为t[3]=t[2]=t[1]=t[0]='a' 是不必要旳
i=3
i=3
j=3
j=-1
23
将next改为nextval: 文档仅供参考,如有不当之处,请联系改正。
j
0
1
2
t[j]
a
a
a
next[j]
-1
0
1
nextval[j]
-1
-1
-1
01 23
s: a a a b
aaab
t: a a b

《数据结构与算法》第四章-串习题

《数据结构与算法》第四章-串习题

《数据结构与算法》第二部分习题精选一、填空题1. 称为空串;称为空白串。

2. 设S=“A;/document/Mary.doc”,则strlen(s)= , “/”的字符定位的位置为。

3. 子串的定位运算称为串的模式匹配,称为目标串,称为模式。

4. 设目标T=”abccdcdccbaa”,模式P=“cdcc”,则第次匹配成功。

5. 若n为主串长,m为子串长,则串的古典(朴素)匹配算法最坏的情况下需要比较字符的总次数为。

二、单选题()1. 串是一种特殊的线性表,其特殊性体现在:A.可以顺序存储B.数据元素是一个字符C.可以链式存储D.数据元素可以是多个字符()2.设有两个串p和q,求q在p中首次出现的位置的运算称作:A.连接B.模式匹配C.求子串D.求串长()3.设串s1=’ABCDEFG’,s2=’PQRST’,函数con(x,y)返回x和y 串的连接串,subs(s, i, j)返回串s的从序号i开始的j个字符组成的子串,len(s)返回串s的长度,则con(subs(s1, 2, len(s2)), subs(s1, len(s2), 2))的结果串是:A.BCDEF B.BCDEFG C.BCPQRST D.BCDEFEF三、计算题1.设s=’I AM A STUDENT’, t=’GOOD’, q=’WORKER’, 求Replac e(s,’STUDENT’,q)和Concat(SubString(s,6,2), Concat(t,SubString(s,7,8)))。

2.已知主串3.s=’ADBADABBAABADABBADADA’,模式串pat=’ADABBADADA’。

写出模式串的nextval函数值,并由此画出KMP算法匹配的全过程。

答案一、填空题1. 不包含任何字符(长度为0)的串由一个或多个空格(仅由空格符)组成的串2. 20 33.被匹配的主串子串4. 65. (n-m+1)*m二、单选题1. B2. B3. D四、计算题解:①Replace(s,’STUDENT’,q)=’I AM A WORKER’②因为SubString(s,6,2)=‘A ’;SubString(s,7,8)=‘STUDENT’Concat(t,SubString(s,7,8))=’GOOD STUDENT’所以Concat(SubString(s,6,2), Concat(t,SubString(s,7,8)))=‘A GOOD STUDENT’2. 解:(由演示程序得知)nextval函数值为0 1 0 2 1 0 1 0 4 0 在第12个字符处发现匹配!s=’ADBADABBAABADABBADADA’pat=’ADABBADADA’。

第4章 串

第4章 串
沈阳工业大学







(4)串比较(compare) int strcmp(char *s1,char *s2); 该函数比较串s1和串s2的大小,当返回值小于0,等于0 或大于0时分别表示s1<s2、s1=s2或s1>s2 例如:result=strcmp(“baker”,”Baker”) result>0 result=strcmp(“12”,”12”); result=0 result=strcmp(“Joe”,”Joseph”); result<0 (5)字符定位(index) char strchr(char *s,char c); 该函数是找字符c在字符串中第一次出现的位置,若找到 则返回该位置,否则返回NULL。 例如:p=strchr(s2,’.’); p 指向“file”之后的位置 s2=“file.cpp”
}
沈阳工业大学







2堆分配存储表示
这种存储表示的特点是,仍以一组地址连续的存储单元 存放串值字符序列,但它们的存储空间是在程序执行过程中 动态分配而得。所以也称为动态存储分配的顺序表。在C语 言中,利用动态存储管理函数,来根据实际需要动态分配和 释放字符数组空间。 typedef char *string; //c中的串库相当于此类型定义
沈阳工业大学







串中任意个连续字符组成的子序列称为该串的子串 ,包含子串的串相应地称为主串。通常将子串在主串中 首次出现时的该子串的首字符对应的主串中的序号,定 义为子串在主串中的序号(或位置)。例如,设A和B分 别为 A=“This is a string” B=“is” 则B是A的子串,A为主串。B在A中出现了两次,其中首 次出现所对应的主串位置是3。因此,称B在A中的序号 (或位置)为3。 特别地,空串是任意串的子串,任意串是其自身的 子串。 通常在程序中使用的串可分为两种:串变量和串常 量。

数据结构(C语言版)(第2版)课后习题答案

数据结构(C语言版)(第2版)课后习题答案

数据结构(C语言版)(第2版)课后习题答案数据结构(C语言版)(第2版)课后习题答案1. 简介数据结构是计算机科学领域中非常重要的一门学科,它研究的是数据的组织、存储和管理方式。

本文将针对《数据结构(C语言版)(第2版)》的课后习题提供答案,帮助读者更好地理解和应用数据结构。

2. 第一章: 绪论在第一章中,主要介绍了数据结构的基本概念、分类和基本操作。

以下是部分习题的答案:2.1 习题1习题描述:什么是数据结构?答案:数据结构是指数据对象中元素之间的关系,以及对这些关系进行操作的方法和技术的集合。

2.2 习题2习题描述:数据结构的分类有哪些?答案:数据结构可以分为线性结构和非线性结构。

线性结构包括线性表、栈、队列等;非线性结构包括树、图等。

3. 第二章: 线性表第二章介绍了线性表的定义、分类和实现。

以下是部分习题的答案:3.1 习题1习题描述:什么是线性表?答案:线性表是由n个数据元素a1, a2, ..., an组成的有限序列,其中元素之间存在着一一对应的关系。

3.2 习题2习题描述:线性表的分类有哪些?答案:线性表可以分为顺序表和链表。

顺序表是用一段地址连续的存储单元一次存储线性表的所有元素,而链表是采用链式存储结构,通过每个元素存储其后继元素的地址来实现元素之间的逻辑关系。

4. 第三章: 栈与队列第三章讲解了栈和队列的定义、特性和实现。

以下是部分习题的答案:4.1 习题1习题描述:栈和队列有什么区别?答案:栈是一种后进先出的线性表,只能在表尾进行插入和删除操作;队列是一种先进先出的线性表,只能在表的一端进行插入和删除操作。

4.2 习题2习题描述:栈的应用有哪些?答案:栈在计算机科学中有广泛的应用,如函数的调用和返回、括号匹配、表达式求值等。

5. 第四章: 串第四章讲解了串的定义、模式匹配和实现。

以下是部分习题的答案:5.1 习题1习题描述:什么是串?答案:串是由零个或多个字符组成的有限序列,串中的字符个数称为串的长度。

数据结构-第四章串

数据结构-第四章串

数据结构-第四章串串也叫字符串,它是由零个或多个字符组成的字符序列。

基本内容1 串的有关概念串的基本操作2 串的定长顺序存储结构,堆分配存储结构;3 串的基本操作算法;4 串的模式匹配算法;5 串操作的应⽤。

学习要点1 了解串的基本操作,了解利⽤这些基本操作实现串的其它操作的⽅法;2 掌握在串的堆分配存储结构下,串的基本操作算法;3 掌握串的模式匹配算法;第四章串 4.1 串的基本概念4.2 串存储和实现4.3 串的匹配算法4.4 串操作应⽤举例第四章串 4.1 串的基本概念 4.2 串存储和实现 4.3 串的匹配算法 4.4 串操作应⽤举例第四章串4.1 串的基本概念 4.2 串存储和实现 4.3 串的匹配算法 4.4 串操作应⽤举例4. 1 串类型的定义⼀、串的定义1 什么是串串是⼀种特殊的线性表,它是由零个或多个字符组成的有,a2, a3, ... a n’限序列,⼀般记作s = ‘a1其中 s----串名, a1,a2, a3, ... a n----串值串的应⽤⾮常⼴泛,许多⾼级语⾔中都把串作为基本数据类型。

在事务处理程序中,顾客的姓名、地址;货物的名称、产地。

可作为字符串处理,⽂本⽂件中的每⼀⾏字符等也可作为字符串处理。

下⾯是⼀些串的例⼦:(1)a = ‘ LIMING’(2)b = ‘NANJING UNIVERSITY OF SCIENCE &TECHNOLOGY’(3)c = ‘ DATA STRUCTURE’(4)d = ‘’说明:1) 串中包含的字符个数,称为串的长度。

长度为0的串称为空串,它不包括任何字符,上⾯(4)中的串d 是空串,(5)中的e 是包含⼀个空格符的空格串;2)串中所包含的字符可以是字母、数字或其他字符,这依赖于具体计算机所允许的字符集。

2 串的有关术语1)⼦串串中任意连续的字符组成的⼦序列称为该串的⼦串例:c = ‘ DATA STRUCTURE’,f=‘DATA’ f是c的⼦串2)⼦串的位置⼦串T 在主串S中的位置是指主串S中第⼀个与T相同的⼦串的⾸字母在主串中的位置。

4-串

4-串

j = 1234567 aaaaaaa 0123456 0000000
9
STRG
0111234 0110114
NEXTVAL[j]=
10 物料管理
Programing and Data Structures: String
3、串的模式匹配算法
3、Knuth-Morris-Pratt 模式匹配算法(KMP 算法) Knuth-Morris-Pratt KMP • 利用 NEXT[j] 函数值寻找模式的程序:
7 物料管理
Programing and Data Structures: String
3、串的模式匹配算法
3、Knuth-Morris-Pratt 模式匹配算法(KMP 算法) Knuth-Morris-Pratt KMP • 分析:多个前缀时,会出现什么问题呢?
i e.g:S = aaaaabaab P = aaaab j
3、串的模式匹配算法
3、Knuth-Mo法) Knuth-Morris-Pratt KMP
• 说明 KMP 算法的实例:
i
失配点
直接寻找新的匹配位置
i
S = abcabcabcd P= abcabcd
e.g: S = abcabcabcd P = abcabcd
i S = aaaaabaab P= aaaab j
i S = aaaaabaab P= aaaab j
7
STRG
3 3、因此应选前缀长度 k -1 < j-1 (此例为 k - 1 = 3 3)的最长的前缀。
8 物料管理
Programing and Data Structures: String
S=aaaaaaaaab P=aab

串的匹配算法

串的匹配算法
位置的字符相等,即: ‘p1p2…pj-kpj-k+1pj-k+2…pj-1’
= ‘si-j+1si-j+2…si-ksi-k+1si-k+2…si-1’
14
第4章 串 第三节 串的匹配算法
二、KMP算法 现假定主串中第i个字符需要与模式串中第k(k<j)个字符比较,则说明,模式串中前k-1个字符与主串中对
7
第4章 串
第二节 串的表示和实现
三、链存储表示 采用链表方式存储串值 每个结点中,可以存放一个字符,也可以存放多个字符
S
H
e
l
l
0^
S
Shen
d a # #^
8
第4章 串
第三节 串的匹配算法
一、求子串位置函数Index() 子串的定位操作通常称做串的模式匹配 算法(穷举法):
从主串的指定位置开始,将主串与模式(要查找的子串)的第一个字符比较, 1.若相等,则继续逐个比较后续字符; 2.若不等,从主串的下一个字符起再重新和模式的字符比较
第三趟匹配
↓i=7--10 ababcabcacbab
a↑bjc=2a c
13
第4章 串
第三节 串的匹配算法
二、KMP算法 假设主串为‘s1s2s3…sn’,模式串为‘p1p2p3…pm’ 若主串中第i个字符与模式串中第j个字符“失配”(si!=pj),说明,模式串中前面j-1个字符与主串中对应
9
第4章 串 第三节 串的匹配算法
一、求子串位置函数Index()
Int Index(Sstring S, Sst位置存放串长度;串采用顺序存储结构
i = pos; j = 1;
// 从第一个位置开始比较
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作结果:若主串S中第pos个字符后存在与T相等的子串则返回 “该子串在主串s中的位置”(子串第一个字符的位序,pos后),否则 返回0.
结束 上页 下页 末页 节
串的基本操作说明:
串的基本操作集不同语言有不同的定义方法, 应以相应语言的参考手册为准。如C语言如下:
char *gets(char *str);//遇回车结束,函数值也为str,<stdio.h> int puts(char *str);//将’\0’转为’\n’输出,函数值为‘\n’或EOF char *strcat(char *destin,char *source)//返回destin,<string.h> char *strcpy(char *str1,char *str2);//str2复制到str1,返回str1 int strcmp(char *str1,char *str2)//相等回0否则返第一不同字符差 unsigned int strlen(char *str)//返回字符个数,不含’\0’ char *strstr(char *str1,char *str2);//返回str2在str1种第一 次出现的位置指针,找不到则返回NULL char *strchr(char *str,char c);//返回c在str中第一次出现的位 置的指针,找不到则返回NULL
pos
i
Sub
pos
S串
T串
V串
额外定义新串:NewStr,后销毁S并重新赋值
Sub
V串
sub
V串
结束 上页 下页 末页 节
4.2 串的表示和实现
对字符串常量类似C语言直接以顺序存储方式 存放各字符,末尾加\0,对串变量则要分情况考虑
➢串的定长顺序存储表示 ➢串的堆分配存储表示 ➢串的块链存储表示
//for(i=1,j=pos;i<=len;++i,++j)Sub[i]=S[j]; *Sub=len;//赋串长 return OK; }
结束 上页 下页 末页 节
2、串的堆分配存储表示—动态分配顺序存储
typedef struct { char *ch; // 存储区首地址或为NULL int length; // 串长度
初始条件:栈S已串S相和等T存返在0,否则返第一个不同字符之“差”或长度差等 操作结果:S>T返回值>0,S=T返回0,S<T返回值<0
Index(S,T,pos) S = abcaabcaaabc,T = bca 初始条件:主串InSd和ex模(S式,T串,1T)=存2在;In,Td非e空x(S,1,T≤,p3)o=s6≤;SIntrdLeexn(gSt,Th,(8S))=。0
StrInsert(&S,pos,T) 初始条件:串S和T存在,1<=pos<=StrLength(S)+1 操作结果:在串S的第pos个字符之前插入串T
StrDelete(&S,pos,len) 初始条件:串S存在,1<=pos<=StrLength(S)-len+1 操作结果:从S中删除第pos个字符开始长len的子串
结束 上页 下页 末页 节
2、串的最小操作子集
除串清空和销毁外StrAssign、Strcopy、Concat、 StrLength、 SubString、StrCompare六种操作 构成一个最小操作子集。其他串操作可在这个最小 操作子集上实现,如Index(S,T,pos)
? StrCompare(SubString(sub,S, i, StrLength(T)),T )
n = StrLength(S); m = StrLength(T); i = pos;
while ( i <= n-m+1) {
SubString (sub, S, i, m);
if (StrCompare(sub,T) != 0) ++i ;
}
//
else return while
i
;
i
} // if return 0;
//字符串生成、销毁操作
StrAssign(&T,chars)
初始条件:chars是字符串常量
操作结果:生成值等于chars的串T
StrCopy(&T,S)
初始条件:串S存在
Concate(T, man, kind)
操作结果:由串S复制得串T
Concat(&T,S1,S2)
求得T = mankind
char *p1=S1+1, *p2=S2+1, *q=T; int len_1=StrLength(S1),len_2=StrLength(S2), len, i; for(i=1;i<=len_1;i++)*q++=*p1++; //结束后q指向待插入位

len=(MAXSTRLEN-len_1)>=len_2? //len为T的长度 len_1+len_2 : MAXSTRLEN;
结束 上页 下页 末页 节
定长顺序存储结构下的基本操作:
Status StrAssign(SString &S,char*T){//T为字符串常量\0结束 char *p=T, *q=S+1; int i=0; while(*p&&i<=MAXSTRLEN){*q++=*p++; ++i; } *S=i; //赋串长,等同S[0]=i,不过前者快 return OK;
初始条件: 串S1和S2存在
操作结果: 由S1与S2连接构成新串T
DestroyString(&S)
初始条件:串S已存在
操作结果:销毁串S
结束 上页 下页 末页 节
串的ADT定义---加工型操作
ClearString(&SS=) chater,T = rac, 操初作始结条果件::将串则SS清已为S存t空在rI串nsert(S, 4, T) 后S = character
} HString; //定长顺序存储结构下数组首元素存放串长, 堆分配存储结构下数组各元素均存放有效 字符
结束 上页 下页 末页 节
Status StrAssign(HString &T, char *chars){ //chars为常量 char *p=chars,q; int i=0; if(T.ch) free(T.ch); while(*p++)i++; //求chars的长度 T.length=i; if (!i) T.ch=NULL; else { T.ch=(char *)malloc(i*sizeof(char)); if (!(T.ch)) exit OVERFLOW; p=chars; q=T.ch; while(*p)*q++=*p++; } return OK;
while(i++<=len) *q++=*p2++; //可能会发生截断 *T=len; //赋串长 return OK; }//注意书中是算法描述,重易读,非程序,无法直接执行
结束 上页 下页 末页 节
பைடு நூலகம்
Status SubString(SString &Sub, SString S, int pos, int len) {
初始条件:S存在,1≤pos≤StrLength(S),0≤len≤StrLength(S)-pos+1
操作结果:用Sub返S回trC串oSm中p第arep(odsa个te字, 符da起ta长)>度0为 len 的子串 StrCompare(S,T) StrCompare(cat, cate)< 0
St初操rE始 作m条结p件果ty::(串空S)串S已返SS经uu回b存bTSS在RttriUrninEg,(g否s(us则ub,b返,c回ostmFuAmdLaeSnnEdte,r5,,09,)求1)求得得subs=ubφ=或r;
SubString(&SuSbu,Sb,Sptorisn,lge(ns)ub, beijing, 7, 2)求得sub = ?
0
i
pos T 串
S串 n-m+1 T 串
结束 上页 下页 末页 节
Index(S,T,pos)
int Index (String S, String T, int pos) {
// T为非空串。若主串S中第pos个字符之后存在与 T相等的子串则返回第一 个这样的子串在S中的位置,否则返回0
if (pos > 0) {
Replace(&S,T,V) 初始条件:串S, T和 V 均已存在, 且 T 是非空串。 操作结果:用V替换主串S中出现的所有与T相等的不重叠子串
S = abcbabcbaabcbcb, T = bcb 若V=x则置换后得S = axaxaaxcb 若V=bc则经置换后得S = abcabcaabccb
➢ 例: a=‘BEI’ b=‘JING’ c=‘BEIJING’ D=‘BEI JING’ ➢ 概念:串的长度 子串 主串 子串在主串中的位置(子串第一个
字符的位序) 串相等 串比较 空串 空格串 φ ➢ 串是一个特殊的线性表,但一般线性表的基本操作常以“单
个元素”作为处理单位,如插入/删除某元素;而串的操作中 多以“多个字符组成的串”为处理单位,如串的连接、求子串 等, 因此对串类型及其操作重新进行定义
int i, j, n; char *p=Sub+1, *q=S+pos ; if (pos<1 || pos>*S) || len<0 || len>*S-pos+1) return ERROR; Sub[1..len]=S[pos..pos+len-1]; //for(i=1;i<=len;++i) *p++=*q++;
相关文档
最新文档