python 126. Word Ladder II(Slack01).py
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 126. Word Ladder II(Slack01).py相关的知识,希望对你有一定的参考价值。
from collections import defaultdict
from string import lowercase
class Solution(object):
def getChildren(self, word, wordset):
children = set([word])
for i in range(len(word)):
for char in lowercase:
newword = word[:i] + char + word[i + 1:]
if newword in wordset:
children.add(newword)
return children
def findLadders(self, beginWord, endWord, wordList):
"""
:type beginWord: str
:type endWord: str
:type wordList: List[str]
:rtype: List[List[str]]
"""
wordset = set(wordList + [beginWord])
if endWord not in wordset:
return []
parent, border = self.bidirectional(beginWord, endWord, wordset)
if not border:
return []
paths = self.biGetAllPath(border, parent, beginWord, endWord)
return paths
def bidirectional(self, beginWord, endWord, wordset):
fronts = [set([beginWord]), set([endWord])]
visited = [set(), set()]
prev = [defaultdict(list), defaultdict(list)]
border = set()
while all(fronts) and not border:
smaller = 0 if len(fronts[0]) < len(fronts[1]) else 1
children = set()
for node in fronts[smaller]:
visited[smaller].add(node)
for node in fronts[smaller]:
for child in self.getChildren(node, wordset):
if child in fronts[not smaller]:
border.add(child)
if child not in visited[smaller]:
children.add(child)
prev[smaller][child].append(node)
fronts[smaller] = children
return prev, border
def biGetAllPath(self, border, parent, beginWord, endWord):
result = map(lambda x: [x], border)
while result[0][0] != beginWord:
result = [[daddy] + path for path in result for daddy in parent[0][path[0]]]
while result[0][-1] != endWord:
result = [ path + [child] for path in result for child in parent[1][path[-1]]]
return result
import string
from collections import defaultdict
class Solution(object):
def findLadders(self, beginWord, endWord, wordList):
"""
:type beginWord: str
:type endWord: str
:type wordList: List[str]
:rtype: List[List[str]]
"""
wordList = set(wordList)
if endWord not in wordList: return []
if beginWord in wordList: wordList.remove(beginWord)
if endWord in wordList: wordList.remove(endWord)
beginSet, endSet = set([beginWord]), set([endWord])
ansFound = False
mp = defaultdict(list)
while beginSet and endSet:
if len(beginSet) < len(endSet):
isBeginSmall, small, big = True, beginSet, endSet
else:
isBeginSmall, small, big = False, endSet, beginSet
nextlvl = set([])
for word in small:
for i in range(len(word)):
for char in string.lowercase:
newword = word[:i] + char + word[i+1:]
if newword in big or newword in wordList:
if newword in big:
ansFound = True
nextlvl.add(newword)
if isBeginSmall: mp[word].append(newword)
else: mp[newword].append(word)
if ansFound: break
for word in nextlvl:
wordList.remove(word)
if isBeginSmall: beginSet = nextlvl
else: endSet = nextlvl
if not ansFound: return []
res = [[beginWord]]
while res[0][-1] != endWord:
tmp = res
res = []
for line in tmp:
for word in mp[line[-1]]:
res.append(line + [word])
return res
以上是关于python 126. Word Ladder II(Slack01).py的主要内容,如果未能解决你的问题,请参考以下文章
python 126. Word Ladder II(Slack01).py
python 126. Word Ladder II(Slack01).py
python 126. Word Ladder II(Slack01).py
python 126. Word Ladder II(Slack01).py