字典 wordList 中从单词 beginWord 和 endWord 的 转换序列
是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> … -> sk:
1 每一对相邻的单词只差一个字母。
2 对于 1 <= i <= k 时,每个 si 都在 wordList 中。注意, beginWord 不需要在 wordList 中。
3 sk == endWord
给你两个单词 beginWord 和 endWord 和一个字典 wordList ,
返回 从 beginWord 到 endWord 的 最短转换序列 中的 单词数目 。
如果不存在这样的转换序列,返回 0 。
解题思路:
同433基音序列一样
从start开始入队
元素出队 依次替换字符串中的每个值 看其是否存在于已访问元素集合内还是等于结束字符串
利用双端队列或者list pop(0)可以较为简单的解决问题
class Solution:
def ladderLength(self, beginWord: str, endWord: str, wordList: List[str]) -> int:
wordList = set(wordList)
if endWord not in wordList:
return 0
length = len(beginWord)
cnt_step = 1
queue, visited = collections.deque(), set()
queue.append(beginWord)
visited.add(beginWord)
while queue:
queueLength = len(queue)
for curStringIdx in range(queueLength):
curString = queue.popleft()
if curString == endWord:
return cnt_step
for charIdx in range(length):
for idx in range(26):
tempString = curString[:charIdx] + chr(97+idx) + curString[charIdx+1:]
if tempString not in visited and tempString in wordList:
queue.append(tempString)
visited.add(tempString)
cnt_step += 1
return 0