def table_sauts(motif, alphabet):
distance_car = dict()
longueur_motif = len(motif)
for caractere in alphabet:
try:
distance_fin = longueur_motif - motif.index(caractere) - 1
if distance_fin > 0:
distance_car[caractere] = distance_fin
except ValueError:
# si le caractère n'existe pas dans le motif, on peut décaler de tout le mot
distance_car[caractere] = longueur_motif
return distance_car
def boyer_moore(seq, motif, alphabet):
lg_motif, lg_seq = len(motif) , len(seq)
saut = table_sauts(motif, alphabet)
print(saut)
position = 0
while(position <= lg_seq - lg_motif):
indice_car = lg_motif - 1
while (indice_car >= 0) and ( motif[indice_car] == seq[position + indice_car] ):
indice_car -= 1
if indice_car < 0:
print("Le motif a été trouvé en position {}".format(position))
position += saut[seq[position + lg_motif - 1]]
else:
position += saut[seq[position + indice_car]]
sequence = 'ATAACAGAGAATAAGGCTAGGCTAAAATACTGAAGGCTA'
motif = 'AGGCTA'
alphabet = 'ACTGI'
boyer_moore(sequence , motif , alphabet)