1.哈希
自定义的字符串映射。
将一串字符串用一定的转化方法,转化为一个值,比较字符串是否相同只需要比较值的相同与否即可。
哈希在很大程度上是没有漏洞的,可以自定义模数或者采用自然溢出的方法。
然而自然溢出已经有人研究出了卡哈希的方法。
为了提高哈希的正确性,后来就有了双哈希。
在一般情况下,哈希冲突的处理很少使用,尽可能避免冲突是提高哈希正确率的更好方法。
哈希冲突时需要定义解决冲突的方法,这一点其实是相当于再次映射,与其这样,如果两个哈希:)
2.KMP
首先来介绍一个叫做next数组的东西,next[i]表示字符串前next[i]位和末next[i]位完全相同。
朴素的字符串匹配,失配之后会从新开始,这样复杂度是O(len1*len2)的,不够快。
失配后如果可以从模式串的一个前缀重新开始就快很多了,这里next数组就派上了用场。
失配后不再是重新开始,而是从next[i]开始。
如果构建next数组呢?
构建的过程就是相当于自己和自己的前缀匹配,用已经构建出的next[i]来推出后来的next数组值。
3.manecher
一个快速找出回文串的算法。
回文串长度的奇偶性会影响我们对回文的判断,所以第一步是将所有回文串长度变为奇数,方法是在每个字符中间加入一个特殊字符。
定义数组P[i],表示以i为回文中心向左或向右可拓展的最长回文长度。
开两个变量x,y分别表示已知的最长回文的中心和该回文的最右端。
如果y>i,则P[i]=min(P[2*y-i],y-i)
这里2*y-i是i关于x的对称点。
如果y<i那i只能暴力匹配。
原文:https://www.cnblogs.com/lmlysklt/p/13941227.html