給定兩個單詞(beginword 和 endword)和乙個字典,找到從 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" 不在字典中,所以無法進行轉換。
第一種思路:
單向bfs搜尋,
起點是當前單詞,下乙個點是當前單詞可以變換一位得到的新單詞,新單詞必須滿足在wordlist裡,求從起點到終點的最短路徑。
用bfs求解。每一次迴圈生成當前單詞可以變換到的所有單詞,再對滿足條件的單詞進行入隊操作。
from collections import deque
class solution(object):
def ladderlength(self, beginword, endword, wordlist):
""":type beginword: str
:type endword: str
:type wordlist: list[str]
:rtype: int
"""if endword not in wordlist or beginword == endword:
return 0
visited = set()
wordlist = set(wordlist)
q = deque()
char = "abcdefghijklmnopqrstuvwxyz"
while q:
cur, cnt = q.popleft() #從佇列裡取乙個出來
if cur == endword: #如果剛好找到了
return cnt + 1
for i in range(len(cur)):
for j in range(26):
word = cur[:i] + char[j] + cur[i + 1:] #把26種變換可能都生成
if word in wordlist and word not in visited: #判斷變換有沒有效
visited.add(word)
return 0
第二種思路:
雙向bfs搜尋,
從beginword和endword向中間開始找,每次搜尋較短的列表用於剪枝,
class solution(object):
def ladderlength(self, beginword, endword, wordlist):
""":type beginword: str
:type endword: str
:type wordlist: list[str]
:rtype: int
"""from collections import deque
if endword not in wordlist:
return 0
wordlist = set(wordlist) #必備優化,不然超時
res, forward, backward = 2, ,
while forward:
if len(forward) > len(backward):
forward, backward = backward, forward
next_level = set()
for word in forward:
for i in range(len(word)):
for k in range(26):
tmp = word[:i] + chr(ord("a") + k) + word[i + 1:]
if tmp in backward: #找到了,勝利會師
return res
if tmp in wordlist:
next_level.add(tmp)
wordlist.remove(tmp)
res += 1
forward = next_level
return 0
LeetCode python 1 兩數之和
題目鏈結 難度 簡單 型別 雜湊表 給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因...
LeetCode Python刷題 1 兩數相加
題目 給定乙個整數陣列nums和乙個目標值target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 返回 0,1 為了測試 是否重複利用陣列元...
LeetCode python 第1題 兩數之和
給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 ...