前言
这个暑假刷了一些leetcode的题目,接触了一些比较有意思的算法,这篇文章来总结一下这几天看到的一些新的算法。我的数据结构学的不是太好,leetcode刷题也算是复习了一下数据结构的相关内容。
KMP算法
这个算法所对应的题目是找到某个substring在原来的string中第一次出现的index
leetcode题目链接:leetcode.com/problems/fi…
如果不了解KMP算法,我们能做的只有暴力遍历两个数组,直到找到完全match的地方,时间复杂度是O()。
而KMP算法的事件复杂度只有O(n+m)
使用KMP算法之前首先要建立一个辅助的数组,名称是lps数组。这个lps数组中的数字代表的是最长的longest proper prefix同时也是suffix长度。
这里举个例子来说一下什么是lps:
ABCD的longest proper prefix有"","A","AB","ABC", suffix有 "", "D", "DCB","DCBA"
那么ABCD的lps的长度就是0。
ABCD的lps数组就是计算A, AB, ABC, ABCD这几个substring的lps的长度。
由上可知,ABCD的lps数组就是[0,0,0,0]
这个lps数组可以说就是这个算法的一大精髓,因为这个数组标记了这个pattern中重复的部分。当我们在比对pattern和string时,如果我们看到了一个不相符的字符,就不需要把两个数组里的pointer都退到前面,只需要找到pattern中重复的部分在哪里,然后只让pattern的pointer回到重复的部分就可以了。这样就可以提高寻找pattern的效率。如果pattern的pointer已经到了尽头,那么我们就继续移动string中的pointer。