def table_bm(m):
"""construit la table de décalages de Boyer-Moore :
d[j][c] est le plus grand k < j tel que m[k] == c,
s'il existe, et n'est pas défini sinon"""
d = [{} for _ in range(len(m))]
for j in range(len(m)):
for k in range(j):
d[j][m[k]] = k
return d
def decalage(d, j, c):
"""utilise la table d lorsque le caractère j est c
au lieu du caractère attendu"""
if c in d[j]:
# c apparaît en d[j][c] et on décale de la différence
return j - d[j][c]
else:
# c n'apparaît pas du tout dans m[0..j-1]
return j + 1
def recherche(m, t):
"""affiche toutes les occurrences de m dans t
avec l'algorithme de Boyer-Moore"""
d = table_bm(m)
i = 0
while i <= len(t) - len(m):
k = 0
for j in range(len(m) - 1, -1, -1):
if t[i + j] != m[j]:
k = decalage(d, j, t[i + j])
break
if k == 0:
print("occurrence à la position", i)
k = 1
i += k