LeetCode 720 詞典中最長的單詞

2021-09-24 17:40:11 字數 2471 閱讀 4960

給出乙個字串陣列words組成的一本英語詞典。從中找出最長的乙個單詞,該單詞是由words詞典中其他單詞逐步新增乙個字母組成。若其中有多個可行的答案,則返回答案中字典序最小的單詞。

若無答案,則返回空字串。

注意:所有輸入的字串都只包含小寫字母。

words陣列長度範圍為[1,1000]。

words[i]的長度範圍為[1,30]。

**實現:

python:

第一種。排序

如果你在面試的時候遇到這個筆試題,建議用這個方法。

簡單描述就是先對words進行排序,建議按照長度排序,這樣可以減少不少計算量,如果按照ascii字元排序.開銷會比較大。

然後定義乙個集合s和乙個字串物件res。

遍歷排序後的words,對於每乙個單詞w,如果滿足如下兩個條件的就將其新增到s中:

長度是1;

w去掉最後乙個字元後形成的子串在s中存在;

因為words中可能有重複的字串,所以我們s定義為集合,就是為了去重。

如果w可以新增到s中,就說明w是有可能作為滿足題目條件的字串被返回的。具體哪個單詞可以返回,我們可以根據下面兩個條件來篩選:

如果w比上乙個潛在字串長(上乙個潛在字串儲存在res中);

如果w和res一樣長,按照字元順序比較兩個字串;

隨著遍歷結束,res中儲存的一定是字母序列最小的最長單詞。

這裡注意乙個小細節,可以大大影響程式效能,題目對words的限制條件是,每個字串的長度都不超過30,但是words可能有1000個字串。所以我們在遍歷排序後的words,如果長度超過30,可以直接忽略掉,因為一定不滿足條件。

c++:

bool m_risesort(string &a, string &b)

class solution

}return res;}};

python:

class solution(object):

def longestword(self, words):

""":type words: list[str]

:rtype: str

"""wds = sorted(words, key=lambda x:len(x))

s = set()

res = ''

for w in wds:

if len(w) > 30:

break

if len(w)==1 or w[:-1] in s:

#if len(w)==len(wds[0]) or w[:-1] in s:

if len(w) > len(res) or w < res:

res = w

s.add(w)

return res

第二種、字首樹(tire tree)其實這道題是乙個典型的關於字首樹的題。實現起來會有些複雜,不建議筆試的時候這樣做。

node形象化的描述,見後面的圖示。

next指標以及allocednode會在後面描述。

我們可以定義乙個空節點作為字首樹的根節點,然後對於words中的每乙個單詞字串w,分拆成乙個個字元,按順序新增到字首樹中。

**21~23行,如果,當前字元在樹中的相遇位置節點為空,那麼建立乙個新的節點,完成賦值後新增到樹中這個位置,同時,該新節點將作為乙個新的起始位置開始遍歷下乙個字元;

**27行,如果當前字元在樹中的相應位置節點存在,那麼該節點會作為新的起始位置開始遍歷下乙個字元;

**29行,如果當前字元是單詞的最後乙個字元,或者說當前單詞遍歷結束,那麼對賦值當前節點的str為當前單詞,這個上面說過了。

我們會注意到,如果乙個節點str是空的,說明在words中不存在以該節點作為結尾字元的單詞,所以在查詢的時候,遇到這樣的節點,就沒必要繼續查詢了。

然後遍歷它的所有的孩子陣列children,如果某乙個孩子是非空的且孩子的str也非空,那就遞迴呼叫search找到該孩子下面儲存的最大的str,返回給t,然後比較t和res以確定哪個更應該作為返回的字串。

如果你觀察遞迴的回溯過程,你可能會覺得,t和res的比較好像有些多餘,因為深度越大的元素,str往往比深度小的元素的str要長,但是其實比較是不可缺少的,因為在當前子樹中它是最長的,不代表它在樹的所有子樹中都是最長的。

搜尋的示圖如下(紅色虛線表示遞迴回溯的過程):

在給定的介面函式longestword中:

**48,49行,我們先定義乙個字首樹節點,memset很重要。

**51,52行,完成字首樹的構建。

**54。從根節點開始,查詢整個樹,找到符合條件的字串。

LeetCode 720 詞典中最長的單詞

給出乙個字串陣列words組成的一本英語詞典。從中找出最長的乙個單詞,該單詞是由words詞典中其他單詞逐步新增乙個字母組成。若其中有多個可行的答案,則返回答案中字典序最小的單詞。若無答案,則返回空字串。示例 1 輸入 words w wo wor worl world 輸出 world 解釋 單詞...

720 詞典中最長的單詞

給出乙個字串陣列words組成的一本英語詞典。從中找出最長的乙個單詞,該單詞是由words詞典中其他單詞逐步新增乙個字母組成。若其中有多個可行的答案,則返回答案中字典序最小的單詞。若無答案,則返回空字串。示例 1 輸入 words w wo wor worl world 輸出 world 解釋 單詞...

雜湊 簡單 720 詞典中最長的單詞

class solution def longestword self,words list str str words.sort key lambda x len x x for w in words flag 1for i in range 1 len w 1 if w i not in wor...