在前面的《最长公共子序列LCS问题》中,我们采用动态规划求解了两个字符串的最长公共子序列的问题,在《最长公共子串》中,我们又用动态规划解决了两个字符串的最长公共子串问题。其中公共子序列问题更加一般,它不要求匹配结果是连续的,公共子串相对特殊一点,它要求匹配连续的子串,二者都不要求其中一个字符串必须完全匹配。在《字典树》中,我们知道字典树也可以用来高效匹配字符串,首先它要求从头开始匹配,其次它匹配的必须是连续的字符串。如果是判断字符串是否相等,还可以利用hash算法。 本篇文章,我们介绍另外一种字符串匹配问题,文章最后对这几种匹配问题进行总结。其形式化定义如下:
假设文本是一个长度为n的数组T[1..n],而模式是一个长度为m的数组P[1..m],其中m<=n,进一步假设P和T的元素都来自一个有限的字母集的字符。
如果0 <= s <= n-m,并且T[s+1..s+m] = P[1..m],那么成模式P在文本T中出现,且偏移为s。如果P在T中以偏移s出现,那么称s是有效偏移;否则,称它是无效偏移。字符串匹配问题就是找到所有的有效偏移。
下面我们来看解决此问题的算法
1.朴素字符串匹配算法
该算法简单暴力,没有任何理解上的问题,伪代码如下:
NAIVE-STRING-NATCHER(T,P)
1. n = T.length
2. m = P.l