題目
給定一組單詞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編程題匯總(持續更新中……)