非主流BFS+记录每个单词所在的层数
def ladderLength(self, beginWord, endWord, wordList):
"""
:type beginWord: str
:type endWord: str
:type wordList: List[str]
:rtype: int
"""
if not wordList or endWord not in wordList:
return 0
stack = [(beginWord,1)]
word_set = set(wordList)
if beginWord in word_set:
word_set.remove(beginWord)
while stack:
word,level = stack.pop(0)
if word == endWord:
return level
for i in range(len(word)):
for j in range(26):
word1 = word[:i]+chr(ord("a")+j)+word[i+1:]
if word1 in word_set:
word_set.remove(word1)
stack.append((word1,level+1)) #这种方式每个单词记录步数不需要多一个for循环
return 0
正常BFS,一层层的来,无需记录
def ladderLength(self, beginWord, endWord, wordList):
"""
:type beginWord: str
:type endWord: str
:type wordList: List[str]
:rtype: int
"""
if not wordList or endWord not in wordList:
return 0
stack = [beginWord]
word_set = set(wordList)
if beginWord in word_set:
word_set.remove(beginWord)
level = 1
while stack:
for _ in range(len(stack)): #这里代表一层层的来
word = stack.pop(0)
if word == endWord:
return level
for i in range(len(word)):
for j in range(26):
word1 = word[:i]+chr(ord("a")+j)+word[i+1:]
if word1 in word_set:
word_set.remove(word1)
stack.append(word1) #这种方式每个单词记录步数不需要多一个for循环
level += 1
return 0
双向DFS
def ladderLength(self, beginWord, endWord, wordList):
"""
:type beginWord: str
:type endWord: str
:type wordList: List[str]
:rtype: int
"""
if not wordList or endWord not in wordList:
return 0
word_set = set(wordList)
set1 = set()
set1.add(beginWord)
set2 = set()
set2.add(endWord)
visited = set()
visited.add(beginWord)
visited.add(endWord)
res = 1
while set1:
if len(set1) > len(set2):
set1, set2 = set2, set1
level = set() #for循环期间不能改变set1,所以加一个临时变量
for word in set1: #这里加上个循环是避免同一层的多算了次数
for i in range(len(word)): #换哪一个字符
for j in range(26):
word1 = word[:i] + chr(ord("a") + j) + word[i + 1:]
if word1 in word_set:
if word1 in set2:
return res + 1
if word1 not in visited:
level.add(word1)
visited.add(word1)
set1 = level
res += 1
return 0
常规双向BFS
def ladderLength(self, beginWord, endWord, wordList):
"""
:type beginWord: str
:type endWord: str
:type wordList: List[str]
:rtype: int
"""
if not wordList or endWord not in wordList:
return 0
word_set = set(wordList)
set1 = set()
set1.add(beginWord)
set2 = set()
set2.add(endWord)
visited = set()
res = 1
while set1:
if len(set1) > len(set2):
set1, set2 = set2, set1
level = set() #for循环期间不能改变set1,所以加一个临时变量
for word in set1:
if word in set2: #这里加上个循环是避免同一层的多算了次数
return res
if word in visited:
continue
else:
visited.add(word)
for i in range(len(word)): #换哪一个字符
for j in range(26):
word1 = word[:i] + chr(ord("a") + j) + word[i + 1:]
if word1 in word_set:
if word1 not in visited:
level.add(word1)
set1 = level
res += 1
return 0