Python程式設計題38--最長單詞
阿新 • • 發佈:2021-12-20
題目
給定一組單詞words,請找出其中的最長單詞,該最長單詞是由words中其他單詞逐步新增一個字母組成。若有多個長度相同的結果,返回其中字典序最小的一項,若沒有符合要求的結果,則返回空字串。
例如:
給定一個words:["a", "banana", "app", "appl", "ap", "apply", "apple"]
返回結果:"apple"解釋:"apply"和"apple"都是由words中的單片語成,但"apple"的字典序小於"apply"
給定一個words:["w","ow","wor","b", "owb"]
返回結果:"b"解釋:這裡words中沒有符合條件逐步組成的最長單詞,所以單個字母就是最終結果,但"w"的字典序小於"b"
說明:
- words中所有單詞都只包含小寫字母。
- words中所有單詞長度均大於0,且至少存在1個長度僅為1的單詞或字母。
- 最長單詞必須是從一個字母開始,在其單詞尾部逐步新增一個字母而得到的結果。
實現思路1
- 定義 max_length 表示最長單詞的長度,其預設值為0;定義一個列表 res_list,用於儲存長度等於 max_length 的所有單詞
- 遍歷 words ,得到所有單詞 word ,並設定一個標記flag,預設值為True,用於判斷 word 是否是能夠完全由其他單片語成
- 每次需對當前遍歷的單詞word進行判斷,如果word並不能完全由其他單片語成,那麼處理 flag = False,同時結束對當前word的遍歷
- 每次對當前遍歷的單詞word進行判斷後,如果 flag = True,那麼說明 word 是能夠完全由其他單片語成,同時需判斷當前word的長度是否大於等於 max_length ,如果是那麼需要更新 max_length ,並把當前word新增到 res_list
- 因為 res_list 中可能存在多個最長的單詞,所以需對其進行比較,可對其進行
sort排序
(字串排序預設按ASCII的大小比較),排序後即可找到其字典序最小的一項
程式碼實現1
def longestWord(words): res_list = [] max_length = 0 words_set = set(words) for word in words: flag = True # 用於標記 word 是否是能夠完全由其他單片語成 for i in range(len(word)): tmp = word[:i + 1] if tmp not in words_set: # set查詢時間複雜度O(1),如果tmp不在words_set中,直接結束當前word的遍歷 flag = False break # 如果當前word遍歷後 flag = True,則說明當前word是能夠完全由words中其他單片語成而來 if flag and max_length <= len(word): max_length = len(word) res_list.append(word) # 可能存在多個最長的單詞,先找到所有最長的單詞,再sort排序(字串排序預設按ASCII的大小比較),排序後的第一個元素就是字典序最小的單詞 res_list = [i for i in res_list if len(i) == max_length] res_list.sort() return res_list[0] if res_list else ""
實現思路2
- 首先對words進行多次排序,第一次按字典序來排序,第二次按單詞長度來排序,排序後得到的words順序是
先按單詞長度降序,再按字典序從小到大
- 遍歷 words ,得到所有單詞 word ,並設定一個標記flag,預設值為True,用於判斷 word 是否是能夠完全由其他單片語成
- 每次需對當前遍歷的單詞word進行判斷,如果word並不能完全由其他單片語成,那麼處理 flag = False,同時結束對當前word的遍歷
- 每次對當前遍歷的單詞word進行判斷後,如果 flag = True,那麼說明 word 是能夠完全由其他單片語成,此時的 word 就是所求的最長單詞
程式碼實現2
def longestWord(words):
words.sort() # 多次排序,第一次找字典序最小的,第二次找長度最大的(reverse=True,降序)
words.sort(key=len, reverse=True)
words_set = set(words)
for word in words:
flag = True
for i in range(len(words)):
tmp = word[:i+1]
if tmp not in words_set: # set查詢時間複雜度O(1),如果tmp不在words_set中,直接結束迴圈
flag = False
break
if flag:
return word
return ""
作者:wintest 出處:https://www.cnblogs.com/wintest 本文版權歸作者和部落格園共有,歡迎轉載,但必須在文章頁面明顯位置給出原文連結,並保留此段宣告,否則保留追究法律責任的權利。更多Python程式設計題,等你來挑戰:Python程式設計題彙總(持續更新中……)