Я предполагаю, что у вас есть список допустимых слов, и вы на самом деле ищете не один путь (почему вы хотите оптимизировать для этого), а множество путей.Это можно сделать довольно легко с помощью networkX :
from networkx import Graph
from networkx.algorithms.shortest_paths import shortest_path, all_pairs_shortest_path
from itertools import combinations
WORDS = {'cat', 'hat', 'sat', 'car', 'cad', 'had', 'pad', 'pat', 'can', 'man'}
def makeGraph(words):
""" create a graph where nodes are words and two words are
connected iff they have one different letter """
G = Graph()
# all word combinations
for a,b in combinations(WORDS,2):
# number of different letters
diff = sum(1 for x,y in zip(a,b) if x!=y)
if diff == 1:
G.add_edge(a,b)
return G
g = makeGraph(WORDS)
# path between two words
print shortest_path(g, 'cat', 'pad')
# generating all shortest paths is way more efficient if you want many paths
paths = all_pairs_shortest_path(g)
print paths['cat']['pad']
Спасибо @Ducan за примеры слов.
Если вы действительно хотите реализовать эти алгоритмы самостоятельно, вы можете найти множество описаний в wikipedia .Классический алгоритм кратчайшего пути с одним источником - Дейкстры , а классический алгоритм кратчайшего пути всех пар - Floyd-Warshall .