基本思考:
已知KMP算法目标串指针的不回溯,能不能利用这个想法开发出其他的不回溯解决方案呢?
考虑这样一种匹配方法:从模式串的第0位开始,如能与目标串对应位置匹配那模式串增加一位并且目标串增加一位,这点大家都明白。接着遇到第一个不匹配的,此时目标串指针不回溯,模式串指针也不回溯。把模式串像右移动一位,相当于把模式串当前指针与目标串下一个匹配,依此类推。当模式串最后一位与目标串匹配时,我们再回过头来从模式串的第0位开始补完前面的匹配。此算法难点在记录模式串匹配指针的最后起始位置,我花了一个多小时写下以上想法的实现算法,可能比较抽象。
def match(pattern,text):
n=len(pattern)
m=len(text)
i,j,k=0,0,0
while j<=n and i<m:
if text[i]==pattern[j]:
i+=1
j+=1
if j==n: #匹配到最后时,跳回第0位
i=i-j
j=0
while j<k:
if text[i]==pattern[j]:
i+=1
j+=1
else:
i+=1
if j==k:
return i-k
else:
i+=1
k=j #记录指针最后不匹配位置
return -1