字符串查找问题
给定文本串S和模式串W,从文本串S中找出模式串W第一次出现的位置
BF
从第一位字符开始,依次匹配,成功就返回,不成功就从第二个字符开始
KMP
Knuth-Morris-Pratt字符串查找算法(简称为KMP算法)可在一个主文本字符串S内查找一个词W的出现位置,此算法通过运用对这个词在不匹配时本身就包含足够的信息来确定下一个匹配将在哪里开始的发现,从而避免重新检查先前匹配的字符
注:颜色相同就是匹配
那么如何找到某个字符前面串的最大相等子串来实现跳转呢
由next[j],表示第j个字符前的最大相等前缀和后缀的长度
第一个位置为next[0]=-1
接下来依照已知的next[j]=k求next[j+1]
- p[k]==p[j], next[j+1]=next[j]+1结束
- p[k] !=p[j],记h=next[k]递归上面步骤
KMP改进
上面的next数组依然有缺陷,下图改进前(左侧),明显跳转k的时候明显不能匹配,因为w[j]=w[k],我们希望直接跳转t处(右侧)
我们可以在求next的时候假如断w[j]==w[k]:next[j]=next[k],因为从一开始本身建立在不相等基础上,所以只要找前面一个
BM
移动字符数是通过两条规则决定的:坏字符规则和好后缀规则。实际移动为通过这两条规则计算出的最大移动个数。
坏字符规则:
- 如果T中的这个不匹配的字符出现在对应P中当前位置的左侧,那么P移动位置将这两个在字符对齐
- 如果T中这个不匹配字符不在P中当前位置的左侧,那么将当前位置左侧的所有字符均移到该不匹配字符后