数据结构_study(四)

字符串:零个或多个字符组成的有限序列

序列:相邻字符之间有前驱和后继

s=“a1a2…an” n>=0
串名称 :s
串值:a1a2…ai…an双引号括起来的字符序列,不包括双引号
ai可以是字母、数字、其他字符,1<=i<=n,i是字符在串中的位置
串长度:串中的字符数目n,n有限

空串:零个字符的串 “”,长度为0
空格串:只包含空格的串,空格也算内容和长度

子串:串中任意个数的连续字符组成的子序列
主串:包含子串的串
子串在主串中的位置:子串的第一个字符在主串的序号

串比较

比较:组成串的编码,词典序

ASCII编码常用字符,7位二进制表示1个字符,总共128个字符
扩展ASCII,8位二进制表示1个字符,总共256个字符
Unicode,16位二进制表示1个字符,总共65万多个字符

串相等:串长度,串各个对应位置的字符都相等

s=“a1a2…an
t=“b1b2…bm

s<t的两种情况
1、n<m,且ai=bi(i=1,2,3…n)
2、存在k<=min(m,n),ai=bi(i=1,2,3…k-1),ak<bk

抽象数据类型

String

Data:字符组成,相邻元素有前驱和后继

Operation:
StrAssign(T, *chars) : 生成一个其值等于字符串常量chars的串T。
StrCoPy(T, S) : 串S存在,由串S复制得串T。
ClearString(S) : 串S存在,将串清空。
StringEmpty(S) : 若串S为空,返回true,否则返回false。
StrLength(S) : 返回串S的元素个数,即串的长度。
StrCompare(S, T) : 若S > T,返回值 > 0,若S - T,返回0,若S < T,返回值 < 0。
Concat(T, S1, S2) : 用T返回由S1和S2联接而成的新串。
Substring(Sub, S, pos, len);串S存在,1pos≤StrLength(s), 且0≤len≤strLength(s) - pos + 1,用Sub返回串S的第pos个字符起长度为1en的子串。
Index(S, T, pos) : 串S和T存在,是非空串,1≤pos≤StrLength(s)。若主串S中存在和串T值相同的子串,则返回它在主串S中第pos个字符之后第一次出现的位置,否则返回0。
Replace(S, T, V) : 串S、T和V存在,T是非空串。用V替换主串S中出现的所有与I相等的不重叠的子串。
StrInsert(S, pos, T) : 串和存在,1spos < StrLength(s) + l。 在串s的第pos 个字符之前插入串T。
StrDelete(S, pos, len) : 串$存在,1≤pos≤StrLength(s) - len + 1. 从串S中删除第pos 个字符起长度为len的子串。

顺序

地址连续的存储单元
每个定义的串变量分配一个固定长度的存储区,定长数组
串值后加一个不计入串长度的结束标记字符 \0

串连接,串插入,串替换都可能串溢出数组

执行过程中动态分配串空间,malloc,free管理,堆:自由存储区
在这里插入图片描述

链式

一个结点可存多个字符,未占满的结点用#或其他非串值字符补全

一个结点存多少个字符,影响处理效率,要根据实际情况做选择

只在连接串时方便

朴素的模式匹配算法

串的模式匹配:子串的定位操作,eg:在文章(大字符串)中找一个单词

把主串的每一个字符作为子串开头,匹配子串
对主串做大循环
每个字符开头做T的长度的小循环
匹配成功或全部遍历完停止

最好情况:第一次就匹配成功O(1)
每次匹配首字母失败,O(n+m),主串n个字符,子串m个字符
最坏情况:每次都到匹配T的最后一个字符失败,主串的每个字符都要匹配m次,匹配O((n-m)+1*m)

在这里插入图片描述

KMP

子串中每个字符不相同,对于图1的前5个字符相同,既可以之间跳过2,3,4,5,直接到第6步
在这里插入图片描述
a和bc不同,跳过2,3,ab和ab相同,跳过4,5
在这里插入图片描述
取消 i 的回溯
j 的变化定义为数组next,长度=T串
j=1:next[j]=0
从1到j-1串之间前缀和后缀有n个字符相同;next[j]=n+1
其他情况 next[j]=1
在这里插入图片描述
时间复杂度为O(n+m)
优势:子串和主串之间存在许多部分匹配

改进KMP

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值