第四章 串

合集下载

严蔚敏数据结构-第四章 串

严蔚敏数据结构-第四章 串
S1 4 a b c d S2 2 e f T 6 a b c d e f
15
(2)S1串长 最大串长 串长<最大串长 串长 最大串长; S1,S2串长和 最大串长 串长和>最大串长 串长和 最大串长;
S1 6 a b c d e f S2 6 g h i j k l T 8 a b c d e f g h
3
串的抽象数据类型的定义: 串的抽象数据类型的定义: 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)
11
作业: 作业: 1.用5种串的基本操作(StrAssign、StrCompare、StrLen Concat、SubString)来逻辑实现StrInsert(&S, pos, T)操作 、 操作. )
Status StrInsert(String S, int pos , String T) { if ……….. return error; , , ); ); ); );
chars是字符串常量。生成一个其值等于chars的串 。 是字符串常量。生成一个其值等于 的串T。 是字符串常量 的串
StrCopy(&T, S)
存在则由串S复制得串 串S存在则由串 复制得串 存在则由串 复制得串T
StrEmpty(S)
存在则若S为空串 串S存在则若 为空串 返回真否则返回假 存在则若 为空串,返回真否则返回假
Sub返回串 的第pos个字符起长度为 返回串S的第 个字符起长度为len的子串 用Sub返回串S的第pos个字符起长度为len的子串

《数据结构与算法(C++语言版)》第4章_串

《数据结构与算法(C++语言版)》第4章_串

串函数与串的类定义
• 常用的 常用的C++串函数 串函数 • C++的串库(string.h)中提供了许多字符串的操作函数,几 个常用的C++字符串函数及其使用方法如下。 •假设已有以下定义语句:
串函数与串的类定义
• (1)串拷贝函数 • char *strcpy(char *s1, const char *s2),将字符串s2复制到字 符串数组s1中,返回s1的值。 • char *strncpy(char *s1, const char *s2, size_tn)将字符串s2中最 多n个字符复制到字符串数组s1中,返回s1的值。 • 例如:
串函数与串的类定义
• (3)串比较函数 • int strcmp(const char *s1, const char *s2),比较字符串s1和字 符串s2。函数在s1等于、小于或大于s2时,分别返回0、小 于0或者大于0的值。 • int strncmp(const char *s1, const char *s2, size_tn)比较字符串 s1中的n个字符和字符串s2。函数在s1等于、小于或大于s2 时,分别返回0、小于0或者大于0的值。 • 例如:
串模式匹配
• 无回溯的匹配算法 • 在上面介绍的匹配算法中,某趟匹配失败时,下一趟的匹 配相当于将子串P后移1位再从头与主串中对应字符进行比 较,即相当于i指示器回溯到上趟(最近失败的一趟)匹配 的起点的下一个位置,这样,主串中每个字符都要与子串 中的第1个字符对应一次,再向后比较。因此,主串中每个 字符参加比较的次数最多可达n次(n为子串长度),因此 时间复杂度为O(nm)。那么,能否使目标串中每个字符只参 加一次比较呢?也就是说,能否不回溯i指示器?回答是肯 定的。这个问题是由D.E.Knoth与V.R.Pratt和J.H.Morris同时 解决的,所以有的文献也称这种思想的串匹配算法为KMP 算法。

数据结构——第4章 串(C#)

数据结构——第4章 串(C#)
将当前链串的所有结点?nstr将q结点插入到尾部将q结点插入到尾部将链串t的所有结点?nstr将q结点插入到尾部尾结点的next置为null返回新建的链串5求子串substrij返回当前串中从第i个字符开始的连续j个字符组成的子串ຫໍສະໝຸດ 第4章 串4.1 串的基本概念
4.1.1 什么是串 串(或字符串)是由零个或多个字符组成的有限序列。 记作str="a1a2…an"(n≥0),其中str是串名,用双引号括 起来的字符序列为串值,引号是界限符,ai(1≤i≤n)是一 个任意字符(字母、数字或其他字符),它称为串的元素, 是构成串的基本单位,串中所包含的字符个数n称为串的 长度,当n=0时,称为空串。
4.2 串的存储结构
4.2.1 串的顺序存储结构-顺序串
和顺序表一样,用一个data数组(大小为MaxSize)和 一个整型变量length来表示一个顺序串,length表示data数 组中实际字符的个数。 定义顺序串类SqStringClass如下:
class SqStringClass { const int MaxSize=100; public char[] data; //存放串中字符 public int length; //存放串长 public SqStringClass() //构造函数,用于顺序串的初始化 { data=new char[MaxSize]; length=0; } //顺序串的基本运算 }
(9)串输出DispStr() 将当前串s的所有字符构成一个字符串并输出。对应的算 法如下:
public string DispStr() { int i; string mystr=""; if (length==0) mystr = "空串"; else { for (i=0;i<length;i++) mystr+=data[i].ToString(); } return mystr; }

数据结构第4章 串

数据结构第4章  串
ring s, SString t)
/*若串s和t相等则返回0;若s>t则返回正数;若s<t则返 回负数*/
{ int i;
for (i=0;i<s.len&&i<t.len;i++)
if (s.ch[i]!=t.ch[i]) return(s.ch[i] - t.ch[i]);
初 始 条 件 : 串 S 存 在 ,1≤pos≤StrLength(S) 且 1≤len≤StrLength(S)-pos+1
操作结果:用Sub返回串S的第pos个字符起长度为len的子串
返回主目录
(11)StrIndex(S,T,pos)
初始条件: 串S和T存在,T是非空串, 1≤pos≤StrLength(S)
return(s.len); }
返回主目录
(7)清空函数
StrClear(SString *s) /*将串s置为空串*/ {
s->len=0; }
返回主目录
(8)连接函数
(1) 连接后串长≤MAXLEN,则直接将B加在A的 后面。 (2) 连接后串长>MAXLEN且LA<MAXLEN,则B 会有部分字符被舍弃。 (3) 连接后串长>MAXLEN且LA=MAXLEN,则B 的全部字符被舍弃(不需连接)。
for (i=s->len + t.len-1;i>=t.len + pos;i--)
s->ch[i]=s->ch[i-t.len];
for (i=0;i<t.len;i++) s->ch[i+pos]=t.ch[i];
s->len=s->len+t.len;

数据结构-第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 串及其基本运算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. 在串尾存储一个不会在串中出现的特殊字符作为串的终结符,以此表示串的结尾。

第四章 串图文

第四章 串图文

在上述串的抽象数据类型定义的13种操作中,串 赋值StrAssign、串复制Strcopy、串比较 StrCompare、求串长StrLength、串联接Concat以 及求子串SubString等六种操作构成串类型的最小 操作子集。即:这些操作不可能利用其它串操作 来实现,而其它串操作(除串清除ClearString和 串销毁DestroyString外)如定位函数Index( S, T, pos )可在这个最小操作子集上实现如p72。
例如:C语言函数库中提供下列串处理函数:
gets(str) 输入一个串; puts(str) 输出一个串; strcat(str1, str2) 串联接函数; strcpy(str1, str2, k) 串复制函数; strcmp(str1, str2) 串比较函数; strlen(str) 求串长函数;
子串的定位
Replace (&S, T, V) 串的置换 StrInsert (&S, pos, T) 串的插入
StrDelete (&S, pos, len) 串的删除
} ADT String
StrAssign (&T, chars)
(串的赋值)
初始条件:chars 是字符串常量。
操作结果:把 chars中的字符串 常量 赋给 T。
StrDelete (&S, pos, len)
初始条件:串S存在
1≤pos≤StrLength(S)-len+1。
操作结果:从串S中删除第pos个字符 起长度为len的子串。
ClearString (&S)
初始条件:串S存在。 操作结果:将S清为空串。
串的基本操作集可以有不同的定义方法, 在使用高级程序设计语言中的串类型时,以该 种语言的参考手册为准。

数据结构第四章串习题及答案

数据结构第四章串习题及答案

习题四串一、单项选择题‎1.下面关于串‎的的叙述中‎,哪一个是不‎正确的?()A.串是字符的‎有限序列 B.空串是由空‎格构成的串‎C.模式匹配是‎串的一种重‎要运算 D.串既可以采‎用顺序存储‎,也可以采用‎链式存储2.串是一种特‎殊的线性表‎,其特殊性体‎现在()。

A.可以顺序存‎储 B.数据元素是‎一个字符C.可以链接存‎储 D.数据元素可‎以是多个字‎符3.串的长度是‎指()A.串中所含不‎同字母的个‎数 B.串中所含字‎符的个数C.串中所含不‎同字符的个‎数 D.串中所含非‎空格字符的‎个数4.设有两个串‎p和q,其中q是p‎的子串,求q在p中‎首次出现的‎位置的算法‎称为()A.求子串 B.联接 C.匹配 D.求串长5.若串S=“softw‎a re”,其子串的个‎数是()。

A.8 B.37 C.36 D.9二、填空题1.含零个字符‎的串称为_‎_____‎串。

任何串中所‎含____‎__的个数‎称为该串的‎长度。

2.空格串是指‎__ __,其长度等于‎__ __。

3.当且仅当两‎个串的__‎____相‎等并且各个‎对应位置上‎的字符都_‎_____‎时,这两个串相‎等。

一个串中任‎意个连续字‎符组成的序‎列称为该串‎的____‎__串,该串称为它‎所有子串的‎_____‎_串。

4.INDEX‎(‘DATAS‎T RUCT‎U RE’,‘STR’)=_____‎___。

5.模式串P=‘abaab‎c ac’的next‎函数值序列‎为____‎____。

6.下列程序判‎断字符串s‎是否对称,对称则返回‎1,否则返回0‎;如 f("abba")返回1,f("abab")返回0;int f((1)__ _____‎_){int i=0,j=0;while‎(s[j])(2)___ _____‎;for(j--; i<j && s[i]==s[j]; i++,j--);retur‎n((3)___ ____)}7.下列算法实‎现求采用顺‎序结构存储‎的串s和串‎t的一个最‎长公共子串‎。

第四章 串

第四章 串
主串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)

数据结构第四章串

数据结构第四章串

(2) 置换操作:用联接算法来实现。用在求子串序号(a,b,h)中得到的 ind 将a分成3部分:第一部分是b在a中的第一个位置前的子串substr (a,1,ind-1);第二部分是b(以c来代替);第三部分是b在a中的最后一个 位置后的子串substr(a,ind+m,n)。 即 a substr(a,I,ind-1)||c||substr(a,ind+m,n)
4. 2 串的基本运算
对于串的基本操作,许多高级语言均提供了相应的运算或标准 库函数来实现。下面仅介绍几种常用的串运算。 (1)联接(concatenation) 联接是串的最基本,最重要的运算。两个串的联接是将一个串 紧接着放在另一个串的末尾。联接用符号“||”表示。 例如:a=”bei” b=“jing” a || b=“beijing” (2)求子串(substr) SUBSTR(a,m,n)功能: 从a 中截取子串,从第m个字符到第n个 字符的子串(m<n)。子串应是将串a中取出从标号m开始的连续n -m+1个字符。 例:SUBSTR(“ABCDEFG”,2,3)=”BC” 利用求子串及联接两种运算可以完成对串的插入、删除和修改。 例如: a=“bejing” b=“iy” ,将b插入到a的第二个字符之后 得到新的串s,则 s=substr(a,1,2) || b || substr(a,3,6) =“beiyjing”
(5)置换(repleace) 置换运算repleace(a,b,c)表示在a中搜索b,若b是a的 子串,就以c代替b,若不是,则经置换后,a不变。 例如:a=“monday”, b=“mon”, c=“thurs” repleace(a,b,c)=“thursday” 置换运算是将串a中所有的子串b用c来代替。 在一部分程序设计语言中没有实现,仍可用前三种运 算来完成。 置换算法过程:实现置换运算repleace(a,b,c),同 样也是在a中搜索是否与b相同的子串,若有,以c来代 替,再继续向下搜,直到在a中找不到和b相同的子串 为止。

数据结构中的串

数据结构中的串
if(pos>=0) { n=StrLength(S); m=StrLength(T); i=pos; while ( i<=n-m ) { SubString( sub,S,i,m );//返回S中从i起长度为m的子串 if( SubCompare (sub,T)!= 0 ) i++; else return i; } // while
StrCompare(S, T) : 若S>T 返回>0;若S=T 返回=0;若
S<T 返回<0;
StrLength( S ) :串S存在,返回S中元素的个数,称为串
的长度
more
串的基本操作
Concat( &T, S1,S2 ) : 用T返回S1和S2联接而成的新串 SubString( &Sub,S,pos,len ) : 用Sub返回串S的第pos个
▪ 两个串之间可以进行比较。 ▪ 称两个串相等,当且仅当这两个串的值相等,包括
两个串的长度相等,并且各个对应位置的字符都相 等。
▪ 当两个串不相等时,可按“字典顺序”分大小。令
s= “s0s1…sm-1” (m>0) t= “t0t1…tn-1” (n>0) ▪ 假设,两者最大有前k个子序列相等(最大相等前缀子
▪ 串中任意个连续的字符组成的子序列称为该串的子串。包含 子串的的串相应地称为主串。通常称字符在序列中的序列号 为该字符在串中的位置。子串在主串中的位置则以子串第0 个字符在主串的位置来表示。
4.1 串的定义和操作
▪ 例如:下面a,b,c,d都是串
▪ a=“BEI”
长度为3
▪ b=“JING”
长度为4
44
第4章 串

数据结构第四章:串

数据结构第四章:串

例2、串的定位 、串的定位index(s,t,pos)
在主串s中取从第 个字符起、 相等的子串和T比较 在主串 中取从第pos个字符起、长度和串 相等的子串和 比较,若 中取从第 个字符起 长度和串T相等的子串和 比较, 相等,则求得函数值为i,否则值增1直至 中不存在和串T相等的子串 直至S中不存在和串 相等,则求得函数值为 ,否则值增 直至 中不存在和串 相等的子串 为止。 为止。
}
4.2 串的表示和实现
首先强调:串与线性表的运算有所不同,是以“串的整体” 首先强调:串与线性表的运算有所不同,是以“串的整体”作 为操作对象,例如查找某子串, 为操作对象,例如查找某子串,在主串某位置上插入一个子串 等。 串有三种机内表示方法: 串有三种机内表示方法:
定长顺序存储表示
顺序 存储 ——用一组地址连续的存储单元存储串值的字 用一组地址连续的存储单元存储串值的字 符序列, 静态存储方式 方式。 符序列,属静态存储方式。
4.1 串类型的定义 4.2 串的表示和实现
4.1 串的类型定义
4.1.1串的定义
定义:串(string)是由零个或多个任意字符组成的字 符序列,是数据元素为单个字符的特殊线性表。 的特殊线性表。 是数据元素为单个字符的特殊线性表 记为:an”
(n≥0 )
第4章 串(String) 章 )
本章主题:串的各种基本运算及其实现 本章主题: 教学目的:了解数据结构的基本概念, 教学目的:了解数据结构的基本概念,理解常用术语 教学重点: 教学重点: 掌握串的基本概念及其基本运算 掌握串的存储结构 主要内容: 主要内容: 1.串的基本概念 2.串的存储结构 2.串的存储结构 3.串的基本运算及其实现 3.串的基本运算及其实现
串其中0<=pos<=strlen(s)-1,且数组 且数组sub至少可容纳 至少可容纳len+1个字符。*/ 个字符。 串其中 且数组 至少可容纳 个字符

第四章 串

第四章 串

第四章串串的定义串的操作数据结构之串24.1 串的定义¾串:由零个或多个字符组成的有限序列,记为S= “a1a2a3……an”。

¾主串、子串、串名、串长;S=“How are you,everybody!”¾空串、空格串;¾字符在串中的位置、子串在串中的位置;¾两个串相等,当且仅当两个串值相等,即长度,位置相等;数据结构之串34.2 串的基本操作¾StrAssign(&T,chars)¾StrCompare(S,T): S、T相等返回true,否则返回faule;¾StrLength(S) : 求串中字符的个数;¾ConCat(S,T) : 将串T的值紧接着放在串S的末尾,组成一个新串;¾SubString(Sub,S,start,length): 求S从start位置开始,长度为length 的子串;数据结构之串4¾SetEmpty(&T) : 设置空串¾StrCopy(S,T): 把T值赋给S;¾Index(S,T,pos): 求子串在主串中位置的定位函数;¾Replace(S,T,v): 以v替换所有在S中出现的和T相等的串;¾StrInsert(S,Pos,T): 在串S的第Pos个字符之前插入串T;¾StrDelete(S,Pos,len): 从串S中删除Pos个字符起长度为len的子串;数据结构之串54.3 串的表示和实现¾定长顺序存储表示¾紧缩格式:在一个存储单元中存放多个字符¾非紧缩格式:一个存储单元中只存放一个字符,所需存储单元个数即串的长度例:如一个单元存放k个字符,长度为n,则此串值占[n/k]个存储单元。

DTA:SAAD T ASW T RCU T UEF S一个存储单元数据结构之串6¾动态分配串值的存储空间;¾动态串的类型定义:typedef struct{char *ch;int length; //串的长度}HS;数据结构之串7¾串的链式存储#define CHUNKSIZE 80 /*由用户定义的块长度*/ typedef struct Chunk {char ch[CHUNKSIZE]; /*字符串块*/struct Chunk *next; /*指向下一个字符串块*/ }Chunk; /*结构名称*/typedef struct {Chunk *head, *tail; /*指向头尾的指针*/int curlen; /*串的当前长度*/} LString; /*串名称*/F A B C1^A B C D E F G H1###^F数据结构之串8¾串基本操作的实现¾将串S1和串S2联接成新串¾算法描述:¾给T分配存储空间,存储空间大小为S1和S2长度之和。

算法与数据结构考研试题精析(第二版)第4章串答案概要

算法与数据结构考研试题精析(第二版)第4章串答案概要

第四章串一、选择题1.B 2.E 3.C 4.A5.C6.A7.1D 7.2F 8.B注9.D 10.B注:子串的定义是:串中随意个连续的字符构成的子序列,并规定空串是随意串的子串,随意串是其自己的子串。

若字符串长度为n(n>0),长为n的子串有1个,长为n-1的子串有2个,长为n-2的子串有3个,,,,长为1的子串有n个。

因为空串是任何串的子串,所以此题的答案为:8*(8+1)/2+1=37。

应选B。

但某些教科书上以为“空串是随意串的子串”无心义,所以以为选C。

为防止考试中的二意性,编者以为第9题出得好。

二、判断题1.√2.√3.√三.填空题1.(1)由空格字符(ASCII值32)所构成的字符串(2)空格个数23.随意个连续的字符构成的子序列4.5 5.O(m+n) 6.011223127.010104218.(1)模式般配(2)模式串.字符9.(1)其数据元素都是字符(2)次序储存(3)和链式储存(4)串的长度相等且两串中对应地点的字符也相等10.两串的长度相等且两串中对应地点的字符也相等。

11.’xyxyxywwy’12.*s++=*t++或(*s++=*t++)!=‘\0’13.(1)chars[] (2)j++ (3)i>=j14.[题目剖析]此题算法采纳次序储存构造求串s和串t的最大公共子串。

串s 用i指针(1<=i<=s.len)。

t串用j指针(1<=j<=t.len)。

算法思想是对每个i(1<=i<=s.len,即程序中第一个WHILE循环),来求从i开始的连续字符串与从j(1<=j<=t.len,即程序中第二个WHILE循环)开始的连续字符串的最大般配。

程序中第三个(即最内层)的WHILE循环,是当s中某字符(s[i])与t中某字符(t[j])相等时,求出局部公共子串。

若该子串长度大于已求出的最长公共子串(初始为0),则最长公共子串的长度要改正。

数据结构课件 第四章 串和数组

数据结构课件 第四章 串和数组

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分配空间

第4章 串

第4章 串

第四章串讲课提要【主要内容】1.串的有关概念及基本操作2.串的存储结构3.串操作应用举例【教学目标】1.掌握串的有关概念及基本运算2.熟悉串的存储结构3.熟悉串操作应用举例学习指导1.概念和术语•串(String)(或字符串):是由零个或多个字符组成的有限序列。

一般记为s= “a1a2…an”(n≥0)其中,s是串的名,用双引号括起来的字符序列是串的值。

•串的长度:串中字符的个数n。

•子串和主串:串中任意个连续的字符组成的子序列称为该串的子串。

包含子串的串相应地称为主串。

•空串:不包含任何字符的串,表示为“Ф”。

•空格串:由一个或多个空格字符组成的串。

例如:“”。

2.串的基本操作(1)用串变量赋值assign(s,t)和用串常量赋值create(s,ss)(2)判等函数equal(s, t)(3)求长函数length(s)(4)连接函数concat(s,t)(5)求子串函数substring(s, pos , len)(6)定位函数index(s,t)(7)置换函数replace(s,t,v)(8)插入子串insert(s,pos,t)(9)删除子串delete(s,pos,k)(10)串的复制copy(s,t)【例3-1】已知字符串:a=“an apple”,b=“other hero”,c=“her”,求:(1)concat(substr(a,1,2),b)。

(2)replace(a,substr(a,5,1),c)。

(3)index(a,c)和index(b,c)。

解:(1)返回值为“another hero”,其中substr(a,1,2)的返回值为“an”。

(2)返回值为“an aherherle”,其中sub(a,5,1)的返回值为“p”。

(3)返回值分别为0和3。

3.串的顺序存储结构(顺序串)串的顺序存储方式类似于线性表的顺序存储方式,其存储结构用C语言描述为:typedef struct strnode {char data[maxlen];int len;}SeqString; //定义顺序串类型【例3-2】设定串采用顺序存储结构,写出对串s1和串s2比较大小的算法。

数据结构-第四章串

数据结构-第四章串

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

基本内容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.1 串的基本概念4.1.1 串的自然语言定义串(string)(或字符串)是由零个或多个字符组成的有限序列,一般记为:S="a1 a2 …… a n" (n≥0)其中,S是串名,用双引号括起来的字符串序列是串的值;a i(1≤i≤n)可以是字母、数字或其他字符;串中字符的个数n称为串的长度。

长度为0的串称为空串。

需要注意的是,串值必须用一对双引号括起来,但双引号本身不属于串,它的作用只是为了避免与变量名或数的常量混淆。

如"tempt"是个串,tempt则是变量名;"23"是串,而23则是一个常量.串中任意个连续的字符组成的子序列称为该串的子串,如:串S="This is a string",其中"This"是一个子串,"string"也是一个子串。

求子串在串中的起始位置称为子串定位或模式匹配。

例如,设A,B,C为如下三个串:A="data",B="structure",C="data structure",则它们的长度分别是4,9,14,A和B都是C的子串,A在C中的位置是1,而B在C中的位置是6。

下面注意区别空格串与空串的概念。

在各种应用中,空格常常是串的字符集合中的一个元素,因而可以出现在其他字符中间。

由一个或多个空格组成的串称为空格串,也就是说空格串中只有空格字符,空格串的长度不为零。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第四章串一、选择题
1.下列有关字符串的描述,正确的是()
A.字符串是0个或多个字符构成的有限序列;
B.字符串是0个或多个字母不同的有限序列;
C.字符串中最少要有一个子符;
D.字符串中不能有空格字符。

2. 字符串S="string"中,包含的子串的个数是()
A. 20
B. 21
C. 22
D. 23
3.目标串为T="this is a string",模式串P="string",进行模式匹配,有效位移是()(起始位置为0)。

A. 9
B. 10
C. 11
D. 12
4.已知串S= "string",T="this",执行运算strlen(strcopy(S,T))的结果是()
A. 4
B. 6
C. 10
D. 2
5.目标串为T="this is a string",模式串P="string",进行模式匹配,所有的无效位移数是()
A. 6
B. 10
C. 16
D. 11
6.下列命题正确的是()
A. 空串就是空白串;
B. 空串不是串;
C. 空串是长度为0的字符串
D. 串相等指的是长度相等
7.若字符串采用链式存储,每个字符占用一个字节,每个指针在占用四个字节,则该字符串的存储密度为()
A. 50%
B. 25%
C. 75%
D. 20%
8.当目标串的长度为n,模式串的长度为m时,朴素的模式匹配算法最坏情况下字符的比较次数()
A . n B. n*m C. (n-m+1)*m D. m
9.当目,模式串的长度为m时,朴素的模式匹配算法最好情况下字符的比较次数()
A. n
B. m
C. n+m D n-m
10.字符串是一种特殊的线性表,它与一般线性表的区别是()
A.字符串是一种线性结构;
B.字符串可以进行复制操作;
C.字符串由字符构成并且通常作为整体参与操作;
D.字符串可以顺序存储也可以链式存储。

11.下所述中正确的是()
A.串是一种特殊的线性表 B.串的长度必须大于零
C.串中元素只能是字母 D.空串就是空白串
12.若目标串的长度为n,模式串的长度为[n/3],则执行模式匹配算法时,在最坏情况下的时间复杂度是()
A.O(n/3) B.O(n) C.O(n2) D.O(n3)
13.设有两个串T和P,求P在T中首次出现的位置的串运算称作()
A.联接 B.求子串 C.字符定
位 D.子串定位
14.为查找某一特定单词在文本中出现的位置,可应用的串运算是()
A.插入 B.删除 C.串联
接 D.子串定位
15.已知函数Sub(s,i,j)的功能是返回串s中从第i个字符起长度为j的子串,函数Scopy(s,t)的功能为复制串t到s。

若字符串S="SCIENCESTUDY",则调用函数Scopy(P,Sub(S,1,7))后得到( )
A.P="SCIENCE" B.P="STUDY" C.S="SCIENCE"
D.S="STUDY"
二、填空题
1.空串的长度为,空格串(空白串)的长度为。

2.子串的定位运算又称为,通常把主串又称为子串又称为。

3.成功匹配的起始位置称为,匹配失败的起始位置称为。

4.设目标串为T="abccdadeef",模式串P="ade",则第趟匹配成功。

5.已知串T="abccdadeef",P="abccyde",函数strcmp(T,P)的运算结果是。

6.串朴素的模式匹配算法在顺序串和链串上运行,时间复杂度。

7.已知串T="abccdadeef",T中包含以b打头的子串有个。

8.通常在程序设计中,串分为和。

9.按存储结构通常分为和。

10.设s1="GOOD",s2="" ,s3="BYE!",则s1,s2,和s3连接后的结果
是。

三.阅读程序题
1.指出程序功能
int stringcmp(Hstring S,Hstring T)
{int i=0,tag=1;
if (S.length!=T.length) tag=0;
else
while(i<S.length&&tag)
if (S.ch[i]==T.ch[i]) i++;
else tag=0;
return tag;
}
2.阅读程序
int stringpatindex (Hstring S,Hstring T)
{int i,j,k;
for(i=0;i<S.length;i++)
{for(j=i,k=0;k<T.length;j++,k++)
if(S.ch[j]!=T.ch[k]&&|T[k]!='?')
break;
if(k>=T.length) return i;
}
return –1;
}
(1)指出程序功能;
(2)设S中存储"there are a string",T中存储"??r"函数的返回值是什么?3.阅读程序指出程序功能
void restring(Hstring S)
{char *p,*q,c;
p=S.ch;q=S.ch+S.length-1;
while(p<q)
{c=*p;*p=*q;*q=c;
p++;q--;
}
}
4.下列算法的功能是比较两个链串的大小,其返回值为:
-1 s1<s2
comstr(s1,s2)= 0 s1=s2
1 s1>s2
请在空白处填入适当的内容。

〖2001〗
int comstr(linkstring s1,linkstring s2)
{//s1和s2为两个链串的头指针
while(s1&&s2) {
if(s1->data<s2->data) return –1;
if(s1->data>s2->data) return 1;
①;
②;
}
if( ③ ) return –1;
if( ④ ) return 1;
⑤ ;
}
四、算法设计题
1.利用C的库函数strlen,strcpy和strcat写一个算法void strinsert(char *S,char *T,int i),将串T插入到串S的第i个位置上。

若i大于S的长度,则插入不执行。

2.利用C的库函数strlen,strcpy和strcat写一个算法void strdelete(char *S,int i,int m),删去串S中从第i个字符开始的连续m个字符。

若i≥strlen(S),则没有字符被删除,若i+m≥strlen(S),。

则将串S中从第i个字符开始直到末尾的字符删去。

tring 为存储表示,写一个求子串的算法。

3.一个文本串可用事先给定的字符映像表进行加密。

例如,设字符映像表为:
abcdefghijklmnopqrstuvwxyz
ngzqtcobmuhelkpdawxfyivrsj
则字符串"encrypt"被加密为"tkzwsdf"。

试写一算法将输入的文本串进行加密后输出;另写一算法将输入的已加密的文本串进行解密后输出。

4.写一算法void strreplace(char *T,char *P,char *S),将T中首次出现的子串P替换为串S。

注意S和T的长度不一定相等。

可以使用已有的串操作。

5.将NaiveStrMatch(T,P)改写为输出目标串中所有与模式串匹配的有效位移。

}
6.写一算法void strreplaceall(char *T,char *P,char *S),将T中出现的所有与P相等的不重叠子串替换S,这里S和P的长度不一定相等。

7.若S和T是用结点大小为1的单链表存储的两个串,是设计一个算法找出S中第一个不在T 中出现的字符。

8.编写算法实现两个串的连接。

9.设计算法删除主串中所有指定子串。

10.编写算法判断串是否为回文。

相关文档
最新文档