Boyer-Moore 算法

2018-11-09  本文已影响24人  Thinkando
image.png

一般都是两个原则一起来的

image.png
def string_match_boyer_moore(string,match,start=0):
    string_len = len(string)
    match_len  = len(match)
    end = match_len - 1
    if string_len < match_len or match_len==0:
        print ('Not Found')
        return start;
    while string[end] == match[end]:
        end -= 1
        if end == 0:
            print ('Success Position:' + str(start))
            return
    idx = contain_char(match,string[end])
    shift = match_len
    if idx > -1:
        shift = end - idx
    start += shift
    string_match_boyer_moore(string[shift:],match,start)

def contain_char(s,c):
   for i in range(len(s)):
      if c == s[i]:
          return i
   return -1

string_match_boyer_moore('here is a simple example','example')

def find_boyer_moore(T,P):
    n,m=len(T),len(P)
    if m==0:return 0
    last = {}
    for k in range(m):
        last[P[k]]=k
    i=m-1
    k=m-1
    while i<n:
        if T[i]==P[k]:
            if k==0:
                return i
            else:
                i -= 1
                k -= 1
        else:
            j = last.get(T[i],-1)
            i+=m-min(k,j+1)
            k=m-1
    return -1

T='here is a simple example'
p='example'
i=find_boyer_moore(T,p)
print(i)
上一篇 下一篇

猜你喜欢

热点阅读