当前位置: 首页 > 后端技术 > Python

力扣-0127.WordLadder单词接龙【Python】

时间:2023-03-26 12:25:25 Python

LeetCode0127.WordLadder单词接龙【Medium】【Python】【BFS】ProblemLeetCode给定两个词(beginWord和endWord),和一个字典的词表,找到最短变换序列的长度从beginWord到endWord,这样:一次只能更改一个字母。每个转换的单词必须存在于单词列表中。注意beginWord不是转换后的单词。注意:如果没有这样的转换序列,则返回0。所有单词的长度相同。所有单词仅包含小写字母字符。您可以假设单词列表中没有重复项。您可以假设beginWord和endWord非空且不相同。示例1:输入:beginWord="hit",endWord="cog",wordList=["hot","dot","dog","lot","log","cog"]Output:5Explanation:因为一个最短的变换是"hit"->"hot"->"dot"->"dog"->"cog",返回它的长度5.Example2:Input:beginWord=“命中”endWord=“cog”wordList=[“hot","dot","dog","lot","log"]输出:0解释:endWord“cog”不在wordList中,因此没有可能的转换。问题给出了两个单词(beginWord和endWord)和一个字典,用于查找从beginWord到endWord的最短转换序列的长度。返回0。所有单词的长度相同。所有单词仅由小写字母组成。字典中没有重复的单词。可以假设beginWord和endWord非空且不相同。示例1:输入:beginWord="hit",endWord="cog",wordList=["hot","dot","dog","lot","log","cog"]输出:5解释:一个最短的转换序列是"hit"->"hot"->"dot"->"dog"->"cog",返回它的长度5。示例2:输入:beginWord="hit"endWord="cog"wordList=["hot","dot","dog","lot","log"]输出:0解释:endWord"cog"不在字典中,所以无法转换.ideasolution1BFS每次转换一个单词可以换一个字母程是图中的一条边,两个词是两个顶点。所以求最短转换序列的长度就是求最短路径,可以用BFS。将26个字母视为26个方向。Python3代码类解决方案:defladderLength(self,beginWord:str,endWord:str,wordList:List[str])->int:#解决方案一:BFSwordDict=set(wordList)#如果endWord不是,则单词列表中没有重复项在wordDict中:return0q,visited=[(beginWord,1)],set()whileq:word,step=q.pop(0)ifwordnotinvisited:visited.add(word)ifword==endWord:returnstepforiinrange(len(word)):forjin"abcdefghijklmnopqrstuvwxyz":#26directionstemp=word[:i]+j+word[i+1:]iftempinwordDict和tempnotinvisited:#从beginWord到endWord的不同方式q.append((temp,step+1))return0解决方案两种方式BFSstart:hitend:cogwordDict:hotdotdoglotlogstack:先开始转换,再判断转换后temp是否在wordDict中,不在则继续继续替换,如果是,判断是否在end,如果是,则返回step+1,如果不是,将temp加入stackstart:hitend:cogwordDict:hotdotdoglotlogstack:hot然后判断len(stack)hot的最短路径,即从后往前查找。重复以上步骤,直到start和end都为空,此时应该返回0,表示没有找到路径。Python3代码类解决方案:defladderLength(self,beginWord:str,endWord:str,wordList:List[str])->int:#解决方案二:DoubleBFSwordDict,step=set(wordList),1ifendWordnotinwordDict:return0start,end=set([beginWord]),set([endWord])whilestart:stack=set([])wordDict-=startforsinstart:foriinrange(len(beginWord)):forjinstring.ascii_lowercase:#a-ztemp=s[:i]+j+s[i+1:]iftempnotinwordDict:continueiftempinend:returnstep+1stack.add(temp)iflen(stack)