LeetCode第127题—单词接龙
自己代码的开源仓库:click here 欢迎Star和Fork :)
题目描述
字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列:
序列中第一个单词是 beginWord 。
序列中最后一个单词是 endWord 。
每次转换只能改变一个字母。
转换过程中的中间单词必须是字典 wordList 中的单词。
给你两个单词 beginWord 和 endWord 和一个字典 wordList ,找到从 beginWord 到 endWord 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 0。
1 |
|
解题思路
Python使用BFS的话,还是会超时,最长的那个过不去,这里就参考大佬的方法。
反正都是小写字母,每次只变动一位,干脆拿到一个节点时生成所有可能的下一个节点,新生成的节点只要再列表中就参与计算。
代码
使用了邻接矩阵的超时版本
1 | class Solution(object): |
去掉邻接矩阵直接判断的版本
别人没超时,我用Python又又超时了,我爆哭.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45class Solution(object):
def one_chart_different(self, str1, str2):
"""
判断输入的两个字符串是不是只有一个不一样, 默认输入的两个字符串长度相同
:param str1: String
:param str2: String
:return: Boolean True/False
"""
num = 0
for i in range(len(str1)):
if str1[i] != str2[i]:
num += 1
if num > 1:
return False
if num == 0:
return False
return True
def new_version(self, beginWord, endWord, wordList):
quene = []
quene.append(beginWord)
step = 0
while len(quene) != 0:
step += 1
sz = len(quene)
while sz > 0:
hope = quene.pop(0)
if hope == endWord:
return step
# 对每个word进行判断
for i in range(len(wordList)):
if len(wordList[i]) == 0 or len(wordList[i]) != len(beginWord):
continue
# 判断差异性
if self.one_chart_different(hope,wordList[i]):
quene.append(wordList[i])
wordList[i] = ""
sz -= 1
return 0
if __name__ == '__main__':
s = Solution()
print(s.new_version(beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log"]))
参考大佬的版本
反正都是小写字母,每次只变动一位,干脆拿到一个节点时生成所有可能的下一个节点,新生成的节点只要再列表中就参与计算。
这次终于通过了,不过耗时几百毫秒。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34def ladderLength(self, beginWord: str, endWord: str, wordList: List[str]) -> int:
if endWord not in wordList:
return 0
l = len(endWord)
ws = set(wordList)
head = {beginWord}
tail = {endWord}
tmp = list('abcdefghijklmnopqrstuvwxyz')
res = 1
while head:
if len(head) > len(tail):
head, tail = tail, head
q = set()
for cur in head:
for i in range(l):
for j in tmp:
word = cur[:i] + j + cur[i+1:]
if word in tail:
return res + 1
if word in ws:
q.add(word)
ws.remove(word)
head = q
res += 1
return 0