我正在尝试解决leetcode问题(https://leetcode.com/problems/word-ladder/description/):
给出两个单词(beginWord和endWord)以及字典的单词列表,找到从beginWord到endWord的最短转换序列的长度,例如:
一次只能更改一个字母。 每个转换的单词都必须存在于单词列表中。注意beginWord不是转换后的单词。 注意:
如果没有这样的转换序列,则返回0。 所有单词的长度相同。 所有单词仅包含小写字母字符。 您可以假设单词列表中没有重复项。 您可以假设beginWord和endWord为非空并且不相同。
输入:
beginWord =“命中”, endWord =“ cog”, wordList = [“ hot”,“ dot”,“ dog”,“ lot”,“ log”,“ cog”]
输出:
5
说明:
最短的转换是“ hit”->“ hot”->“ dot”->“ dog”-> “ cog”,返回其长度5。
import queue
class Solution:
def isadjacent(self,a, b):
count = 0
n = len(a)
for i in range(n):
if a[i] != b[i]:
count += 1
if count > 1:
return False
if count == 1:
return True
def ladderLength(self,beginWord, endWord, wordList):
word_queue = queue.Queue(maxsize=0)
word_queue.put((beginWord,1))
while word_queue.qsize() > 0:
queue_last = word_queue.get()
index = 0
while index != len(wordList):
if self.isadjacent(queue_last[0],wordList[index]):
new_len = queue_last[1]+1
if wordList[index] == endWord:
return new_len
word_queue.put((wordList[index],new_len))
wordList.pop(index)
index-=1
index+=1
return 0
有人可以建议如何优化它并防止错误!
答案 0 :(得分:1)
基本思想是更快地找到相邻的单词。不用考虑列表中的每个单词(即使是已经按单词长度过滤的单词),也可以构造每个可能的相邻字符串并检查它是否在字典中。为了快速查找 ,请确保单词列表存储在set
之类的支持快速成员资格测试的地方。
要更快地进行搜索,您可以存储两个排序的单词列表,每个单词列表按 reverse 排序。然后寻找在反向列表的前半部分和普通列表的后半部分更改字母的可能性。然后,无需创建任何非单词字符串即可找到所有现有邻居。这甚至可以扩展到 n 个列表,每个列表通过从所有单词中省略一个字母来排序。