def indice(lettre, ordre): for i in range(len(ordre)): if ordre[i] == lettre: return i def comparer (mot1, mot2, ordre): i= 0 while i < len(mot1) and i < len(mot2): il = indice(mot1[i], ordre) i2 = indice(mot2[i], ordre) if il < i2: return True elif il > i2: return False i += 1 return len(mot1) < len(mot2) def premiere_diff(mot1, mot2): i= 0 while i < len(mot1) and i < len(mot2): if mot1[i] != mot2[i]: return i i += 1 return min(len(mot1), len(mot2)) def dico_adj(mots): adj = {} for (mot1, mot2) in mots: ident = premiere_diff(mot1, mot2) if ident < len(mot1) and ident < len(mot2): petite = mot1[ident] grande = mot2[ident] if petite not in adj: adj[petite] = [grande] else: adj[petite].append(grande) return adj def parcours(adj, s, deja_vus, tri): if s in adj: for v in adj[s]: if v not in deja_vus: deja_vus.append(v) parcours(adj, v, deja_vus, tri) tri.append(s) def trier(mots): adj = dico_adj(mots) tri = [] deja_vus = [] for s in adj: if s not in deja_vus: deja_vus.append(s) parcours(adj, s, deja_vus, tri) tri.reverse() return tri mots_exemple = [("oou", "ooai"), ("yee", "ieo"), ("ye", "aaaa"), ("a", "ieo"), ("euee", "eyy"), ("ao", "au"), ("e", "a")] # print(dico_adj(mots_exemple)) print(trier(mots_exemple))