題目
難度:★★☆☆☆
類型:字符串
如果單詞列表(words)中的一個單詞包含牌照(licensePlate)中所有的字母,那么我們稱之為完整詞。在所有完整詞中,最短的單詞我們稱之為最短完整詞。
單詞在匹配牌照中的字母時不區(qū)分大小寫,比如牌照中的 "P" 依然可以匹配單詞中的 "p" 字母。
我們保證一定存在一個最短完整詞。當(dāng)有多個單詞都符合最短完整詞的匹配條件時取單詞列表中最靠前的一個。
牌照中可能包含多個相同的字符,比如說:對于牌照 "PP",單詞 "pair" 無法匹配,但是 "supper" 可以匹配。
注意
牌照(licensePlate)的長度在區(qū)域[1, 7]中。
牌照(licensePlate)將會包含數(shù)字、空格、或者字母(大寫和小寫)。
單詞列表(words)長度在區(qū)間 [10, 1000] 中。
每一個單詞 words[i] 都是小寫,并且長度在區(qū)間 [1, 15] 中。
示例
示例 1
輸入:licensePlate = "1s3 PSt", words = ["step", "steps", "stripe", "stepple"]
輸出:"steps"
說明:最短完整詞應(yīng)該包括 "s"、"p"、"s" 以及 "t"。對于 "step" 它只包含一個 "s" 所以它不符合條件。同時在匹配過程中我們忽略牌照中的大小寫。
示例 2
輸入:licensePlate = "1s3 456", words = ["looks", "pest", "stew", "show"]
輸出:"pest"
說明:存在 3 個包含字母 "s" 且有著最短長度的完整詞,但我們返回最先出現(xiàn)的完整詞。
解答
我們可以使用下面的代碼實現(xiàn),代碼簡潔邏輯清晰,不過需要對Python的一些內(nèi)置函數(shù)具有了解,流程是這樣的:
刪除牌照字符串中的非字母字符,并將所有字符小寫,使用Counter統(tǒng)計處理后的牌照字符串中所有字符出現(xiàn)的次數(shù);
將單詞列表中每一個詞做類似處理,將處理后的統(tǒng)計詞表與牌照統(tǒng)計字典相減后取反,如果單詞中的字母可以包括牌照,那么結(jié)果會成為True,我們以此為過濾器過濾出可以滿足條件的單詞,并取這些單詞的最小長度。
from collections import Counter
class Solution:
def shortestCompletingWord(self, licensePlate, words):
plate_counter = Counter(filter(str.isalpha, licensePlate.lower()))
return min(filter(lambda word: not plate_counter-Counter(word.lower()), words), key=len)
如有疑問或建議,歡迎評論區(qū)留言~