1. 程式人生 > 其它 >Python程式設計題38--最長單詞

Python程式設計題38--最長單詞

題目

給定一組單詞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 ""

更多Python程式設計題,等你來挑戰:Python程式設計題彙總(持續更新中……)

作者:wintest 出處:https://www.cnblogs.com/wintest 本文版權歸作者和部落格園共有,歡迎轉載,但必須在文章頁面明顯位置給出原文連結,並保留此段宣告,否則保留追究法律責任的權利。