【发布时间】:2022-11-19 07:56:56
【问题描述】:
我有一个有点复杂的问题。我得到了一个单词列表(每个单词的长度相同)。我的函数中有两个词(StartNode 和 EndNode),我的任务是找到两者之间的最短路径(后续将是如何收集从 startNode 到 EndNode 的所有路径)。只有当单词最多相差 1 个单词时,它们才能连接起来。例如,TRIE 和 TREE 可以连接,因为它们仅相差一个字母 (I v E),但 TRIE 和 TWEP 不能连接,因为它们有 2 个字符差异。
我的解决方案是先建立一个邻接表,我成功实现了,然后计算一个BFS来确定startNode和endNode之间是否存在路径。我能够确定路径是否存在,但不确定如何跟踪路径。
我的尝试如下:
def shortestPath(startNode, endNode, words):
adjList=createGraph(words)
print(adjList)
#Returns shortest path from startNode to EndNode
visited=set()
q=collections.deque()
total=-1
q.append(startNode)
while q:
node=q.popleft()
visited.add(node)
if node==endNode:
if node!=startNode:
return total+1
total=total+1
for i in adjList[node]:
if i not in visited:
print(i)
q.append(i)
return -1
我的 BFS 没有采用路径并且 total_length 也很明显是错误的。有什么办法可以改进我的算法吗?
示例输入:
{'POON': ['POIN', 'LOON'], 'PLEE': ['PLEA', 'PLIE'], 'SAME': [], 'POIE': ['PLIE', 'POIN'], 'PLEA': ['PLEE', 'PLIE'], 'PLIE': ['PLEE', 'POIE', 'PLEA'], 'POIN': ['POON', 'POIE'], 'LOON': ['POON']}
startWord: POON
endWord: PLEA
预期输出:
POON -> POIN -> POIE -> PLIE -> PLEA
当前输出:
POIN
LOON
POIE
PLIE
PLEE
PLEA
PLEA
6
关于我哪里出错的任何提示?
【问题讨论】:
-
你从 POON 开始。然后,您的循环会打印两个可能的步骤(POIN、LOON),然后再次循环。然后弹出 POIN。 POON 已被访问,因此它打印 POIE。除非为每个分支保留单独的“已访问”列表,否则您无法执行 BFS。
-
@TimRoberts 是的,另一种方法是使用 DFS,但我怎么能选择不实施 DFS,因为它在确定最短路径方面效率低下,而且即使那样我也不确定如何在 DFS 中合并路径。该算法非常擅长确定最短路径,但我完全不知道如何将路径合并到其中。为每个分支保留一个单独的“访问过”列表。这是否意味着我在弹出第一个元素后附加到路径?
标签: python breadth-first-search shortest-path