我们都知道朴素匹配算法是从头到尾正向匹配,如果匹配失败则将模式串P向右移动一位继续匹配
如:
上面是主串S,下面是模式串P。这种匹配方式是从P[0]开始一个一个进行比较。P[0]与S[0]比较,P[1]与S[1]比较......
那我们换个角度想一想,能不能从尾部开始比较呢?答案当然是可以的
如:
同样的位置,我们先比较P[6]与S[6],如果相等则再比较P[5]和S[5].....
这种比较方法就叫朴素逆向匹配算法,它与朴素匹配算法的区别在于它是从模式串的最后一位开始比较的,当然如果匹配失败则将模式串向右移动一位。
朴素逆向匹配算法的伪代码如下:
Reverse-Naive-Search(T,P)
01 for s ¬ 0 to n – m
02 j ¬ m – 1 // start from the end
03 // check if T[s..s+m–1] = P[0..m–1]
04 while T[s+j] == P[j] do
05 j ¬ j - 1
06 if j < 0
07 print “pattern occurs with shift” s
朴素逆向匹配算法的时间复杂度和朴素匹配算法一样,都是O(m*n)