LeetCode Python 127 單詞接龍

2021-09-23 20:49:59 字數 2514 閱讀 4810

給定兩個單詞(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 ...