什么是串?我之前也会觉得这不是很简单,abcd,里面ab就算串,突然明白了那一句,永远不要觉得自己已经知道了
1-串的本质是线性表,那串就是特殊的线性表,之前线性表元素没有限制元素范围,串的元素限制一定得是字母,还有一个比较特殊的是什么,串的操作都是针对不只一个元素进行的,就是针对子串
2-既然是线性表,那么存储方式就那么几种,要么静态固定长度,优点好取好查,缺点不好增删,自动回收,要么动态,就是设置一个指针,一个个往后加,就是得手动free,第三种是为了解决不好增删的缺点,链式存储,块链存储,就是可以存储多个字符在一个元素,缺点明显就是密度低
3-因为串主要不是针对单个,所以无法用之前和普通线性表一样的增删改查函数以及逻辑,就需要针对串的特殊性做很多对多个字符,即子串进行操作的特殊函数,StrAssign赋值,这种,复制,清空,判空,比较(先出现更小),串长,子串,定位,联接,销毁这种,都是针对子串
4-接下来是我们的主要算法-模式匹配,先想,为什么要针对这个kmp算法想那么多优化呢?和增删改查什么关系?因为串本质是针对子串操作,最常用就是一段找一小段操作,不管进行哪一种操作,找到它,匹配它,都是必经之路
4.1-朴素的kmp是,自然而然想到的就是暴力,主串列出所有可能子串,一一对比模式串(mn复杂度)
太复杂了怎么办,优化,一切优化的本性是去重,是分析每一次怎么运动的,怎么计算的,发现重复,降低重复,不走回头路的同时,走的还是康庄大道
4.2-浅优化的kmp是next,匹配不变的是什么,不是主串,主串是会变的,是模式串,模式串的重复会导致和主串匹配的重复,这里是发现了模式串的子串有重复,故不匹配的时候,找下一个地方,优化的就是这个下一个地方,不重复匹配重复的模式串的子串,next(j)=j前重复长度s再+1,这样就减少了重复子串匹配的次数
4.3-进一步优化的kmp是nextval,前面是模式串里面重复子串的重复,还有什么重复呢?之前的大的,现在是少的重复,这样才是细化的方向,落实在串里就是有没有重复的字母/字符,比如很多个a一起出现,如果前面a不匹配,后面a也是不匹配,这就是重复,怎么降低,那就后面的a的next(j)就用之前a的next(j)的值,这样就减少了重复字母匹配的次数