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)