当前位置:   article > 正文

leetcode——单词接龙_leetcode 单词接龙

leetcode 单词接龙

 126. 单词接龙 

给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列。转换需遵循如下规则: 每次转换只能改变一个字母。 转换后得到的单词必须是字典中的单词。 说明: 如果不存在这样的转换序列,返回一个空列表。 所有单词具有相同的长度。 所有单词只由小写字母组成。 字典中不存在重复的单词。 你可以假设 beginWord 和 endWord 是非空的,且二者不相同。

  1. 示例 1:
  2. 输入:
  3. beginWord = "hit",
  4. endWord = "cog",
  5. wordList = ["hot","dot","dog","lot","log","cog"]
  6. 输出:
  7. [
  8. ["hit","hot","dot","dog","cog"],
  9. ["hit","hot","lot","log","cog"]
  10. ]
  11. 示例 2:
  12. 输入:
  13. beginWord = "hit"
  14. endWord = "cog"
  15. wordList = ["hot","dot","dog","lot","log"]
  16. 输出: []

 解释: endWord "cog" 不在字典中,所以不存在符合要求的转换序列。

代码

1 先上一个最终的版本,其实是仿照大佬代码照猫画虎的

  1. class Solution2:
  2. def findLadders(self, beginWord, endWord, wordList):
  3. if endWord not in wordList:
  4. return 0
  5. s1 = {beginWord}
  6. s2 = {endWord}
  7. step = 0
  8. while s1 and s2:
  9. if len(s1)>len(s2):s1, s2 = s2, s1
  10. step += 1
  11. s = set()
  12. for preword in s1:
  13. n = len(preword)
  14. next_words = [preword[:i] + chr(j) + preword[i+1:] for j in range(97, 123) for i in range(n)]
  15. for word in next_words:
  16. if word in s2:
  17. return step + 1
  18. if word not in wordList:
  19. continue
  20. wordList.remove(word)
  21. s.add(word)
  22. s1 = s
  23. return 0

 

接着说一下我的心路历程

开始看到这道题没啥思路,感觉求起来太麻烦。。。 可能对路径这种题有点不知所措。。。 后来简单看了下解题思路 ,有一种替换映射词表的逻辑, 就是例如key = “a*b”, value = 满足’a*b‘ 的词典中的单词, *表示任意字符,也就是获取有一位字母不一样的单词有哪些

  1. class Solution:
  2. def get_word_dic(self, wordList):
  3. dic = dict()
  4. for word in wordList:
  5. for i in range(len(word)):
  6. mark = word[:i] + '*' + word[i + 1:]
  7. dic.setdefault(mark, [])
  8. if word not in dic[mark]:
  9. dic[mark].append(word)
  10. return dic
  11. def find(self, pre_word_lists, endWord, dic):
  12. if len(pre_word_lists)==0:
  13. return []
  14. res = []
  15. level1_word_lists = []
  16. for pre_word_list in pre_word_lists:
  17. beginWord = pre_word_list[-1]
  18. level1_words = set()
  19. for i in range(len(beginWord)):
  20. mark = beginWord[:i] + '*' + beginWord[i + 1:]
  21. if mark not in dic:
  22. continue
  23. if endWord in dic[mark]:
  24. res.append(pre_word_list + [endWord])
  25. level1_words.update([x for x in dic[mark] if x not in pre_word_list])
  26. level1_word_lists.extend([pre_word_list + [x] for x in level1_words])
  27. if len(res) > 0:
  28. return res
  29. paths = self.find(level1_word_lists, endWord, dic)
  30. if len(paths) > 0:
  31. return paths
  32. return []
  33. def ladderLength(self, beginWord: str, endWord: str, wordList: List[str]) -> int:
  34. if endWord not in wordList:
  35. return 0
  36. dic = self.get_word_dic(wordList)
  37. paths = self.find([[beginWord]], endWord, dic)
  38. if len(paths)==0:
  39. return 0
  40. return len(paths[0])

超时了,然后看了看大牛的思路,写了最上面的那个代码,但是还是有点不甘心啊,想找找我的代码哪里慢。

双向这个问题就不用多说了,肯定是影响很大的,但是测了下时间, 把双向那句 if len(s1)>len(s2):s1, s2 = s2, s1 注掉,依然是比我的快很多的。

探索是不是每次从词典里面查比较费时,改成 像最上面代码中的a-z替换的逻辑., 提交后依然超时了。

再看看其它的地方,感觉是词典remove的问题,加上词典remove的操作 ,如下代码, 提交还是会超时,但是过了更多的测试用例

  1. class Solution:
  2. def find(self, pre_word_lists, endWord, wordList):
  3. if len(pre_word_lists)==0:
  4. return 0
  5. level1_word_lists = []
  6. for pre_word_list in pre_word_lists:
  7. beginWord = pre_word_list[-1]
  8. nextword = []
  9. for i in range(len(beginWord)):
  10. for j in range(97, 123):
  11. word = beginWord[:i] + chr(j) + beginWord[i + 1:]
  12. if word in wordList and word not in pre_word_list:
  13. nextword.append(word)
  14. wordList.remove(word)
  15. if endWord in nextword:
  16. return len(pre_word_list + [endWord])
  17. level1_word_lists.extend([pre_word_list + [x] for x in nextword])
  18. return self.find(level1_word_lists, endWord, wordList)
  19. def ladderLength(self, beginWord: str, endWord: str, wordList: List[str]) -> int:
  20. if endWord not in wordList:
  21. return 0
  22. return self.find([[beginWord]], endWord, wordList)

 

发现最后还是得改成双向的才行,不然词典太长,路径太多,还是会引起爆炸的路径搜索问题...

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/144284
推荐阅读
相关标签
  

闽ICP备14008679号