数据结构第四章串总结

第四章总结

什么是串?
串是由零个或多个字符组成的有序序列,记
S=‘a1a2a3…an’;
空串即长度为0的串,空格串是较特殊的串,不属于空串,串长等于空格数。

串的存储结构
在这里插入图片描述

重点

串匹配,也称模式匹配

串匹配方法有暴力匹配与KMP匹配算法;

暴力匹配:简单,不做赘述。

KMP算法:核心next数组,这玩意就是前缀与后缀相等的字符的最长长度,为啥要求这个呢?都知道暴力匹配指针需要回溯,而next的目的就是去除主串回溯问题。怎么做到的呢?例如一个串长11,当匹配的时候,假如该串的第四个元素失配,而next[4] = 1,next【4】= 1也就是第四个元素的前3个元素的前后缀相同的最大长度为1,此时保持主串指针不动,移动子串,关键是移动几位呢,这就关系到next数组了,得理解next数组的含义,子串向后移动的位数为Move = 已匹配位数 - next【4】,因为是第四位失配,所以已匹配位数为3,而next【4】= 1,因此移动位数为Move = 3 - 1 =2;下面是关键,因为根据next数组的含义,前三个元素的前缀和后缀相同的最长长度为1,如下图
在这里插入图片描述
主串与模式串第四位失配,第四位的前三位为aba,前缀为{a,ab},后缀为{a,ba} 取前后缀交集,得{a},前后缀相同的为a,长度为1,即模式串的next【4】= 1,也就是第一位与第三位相同,第四位匹配失败,就把第一个a移动到下一个a处,而移动到下一个a的移动位数就为Move = 已匹配位数 - next【4】 = 2;如果前后缀相同的子串为{a,ab},则最大长度为2,即next【4】 = 2,移动就是把开头的ab对应到下一个ab,next的作用就是失配时,子串后移的问题。注意,子串指针得移动到j = next[4]+1,因为最大长度是1,只需把a移到下一个a,子串指针指向a的下一位即可。(讲得已经很口水话了)。以上求的next数组定义是这样的next[1] = -1;next[2] = 0;还有一种是next[1] = 0;next[2] = 1;后者与前者的不同在于后者得出的每一个元素的next总是比前者大1,对于第二种定义,子串回溯到j = next[j]即可;

还有一个nextval数组,可参考B站 https://www.bilibili.com/video/BV1d54y1q7ko/?spm_id_from=333.337.search-card.all.click&vd_source=13cb0308676af1256761c51e3bb2ba69,就是继承第一个祖先的next。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值