字符串匹配的形式化定义:假设文本是一个长度为n的数组T[1,2…n],而模式是一个长度为m的数组P[1,2…m],其中m<=n,进一步假设P和T的元素都来自一个有限的字母集Σ的字符,例如Σ={0,1}或者Σ={a,b…z},字符数组P和T通常称为字符串。
如下图所示,如果0<=s<=n-m,并且T[s+1…s+m]=P[1…m],那么称模式P在文本T中出现,并且偏移为s。如果P在T中以偏移s出现,那么称s为有效偏移,否则为无效偏移。字符串匹配问题就是找到有效偏移。(图源《算法导论》)
定理1:假设x,y和z是满足和y⊐z (
表示后缀)的字符串,如果|x|<=|y|,那么
.(显然,如果x和y都是z的后缀,而且x长度比y小,那么x肯定也是y的后缀)
一、朴素的字符串匹配
朴素字符串匹配即通过一个循环来找到所有的有效偏移,该循环对n-m+1个可能s值进行检查,看是否满足P[1…m]=T[s+1…s+m].
伪代码如下:
在最坏情况下,朴素匹配方式的时间复杂度是O((n-m+1)*m)
朴素匹配尽管代码十分简洁通俗,但一般情况下效率并不高。