題目描述:
給定乙個字串牌照 licenseplate 和乙個字串陣列 words ,請你找出並返回 words 中的 最短補全詞 。
如果單詞列表(words)中的乙個單詞包含牌照(licenseplate)中所有的字母,那麼我們稱之為 補全詞 。在所有完整詞中,最短的單詞我們稱之為 最短補全詞 。
單詞在匹配牌照中的字母時要:
題目資料保證一定存在乙個最短補全詞。當有多個單詞都符合最短補全詞的匹配條件時取單詞列表中最靠前的乙個。
示例一:
輸入:licenseplate = 「1s3 pst」, words = [「step」, 「steps」, 「stripe」, 「stepple」]
輸出:「steps」
說明:最短補全詞應該包括 「s」、「p」、「s」 以及 「t」。在匹配過程中我們忽略牌照中的大小寫。
「step」 包含 「t」、「p」,但只包含乙個 「s」,所以它不符合條件。
「steps」 包含 「t」、「p」 和兩個 「s」。
「stripe」 缺乙個 「s」。
「stepple」 缺乙個 「s」。
因此,「steps」 是唯一乙個包含所有字母的單詞,也是本樣例的答案。
示例 2:
輸入:licenseplate = 「1s3 456」, words = [「looks」, 「pest」, 「stew」, 「show」]
輸出:「pest」
說明:存在 3 個包含字母 「s」 且有著最短長度的補全詞,「pest」、「stew」、和 「show」 三者長度相同,但我們返回最先出現的補全詞 「pest」 。
方法一:比較計數
演算法:我們計算 word 和 licenseplate 中的字母數,轉換為小寫並忽略非字母字元。如果單詞中每個字母的計數大於或等於
licenseplate 中的字母數,則該單詞是 licenseplate 的完整詞。
我們需要選擇最短的完整詞且最先出現的單詞。
class
solution
public
boolean
dominates
(int
count1,
int[
] count2)
public
int[
]count
(string word)
return ans;
}}
方法二:雜湊
解題思路:
用長度為26的int陣列作為雜湊表,統一使用小寫(大寫字母轉換為小寫),記錄每個字母出現的次數。
根據licenseplate構造好雜湊表,再對words的每個單詞進行檢查。
若license所有字母包括個數(忽略字母以外的數字空格等字元)都匹配上,再判斷單詞長度,從而得到最短完整單詞;若有多個最短完整詞,輸出最靠前的乙個。
class
solution
}for
(string w : words)
if(cnt2 ==
0&& len < shortest)}}
return output;
}}
748 最短完整詞
如果單詞列表 words 中的乙個單詞包含牌照 licenseplate 中所有的字母,那麼我們稱之為完整詞。在所有完整詞中,最短的單詞我們稱之為最短完整詞。單詞在匹配牌照中的字母時不區分大小寫,比如牌照中的 p 依然可以匹配單詞中的 p 字母。我們保證一定存在乙個最短完整詞。當有多個單詞都符合最短...
LeetCoda 748 最短完整詞
單詞在匹配牌照中的字母時不區分大小寫,比如牌照中的 p 依然可以匹配單詞中的 p 字母。我們保證一定存在乙個最短完整詞。當有多個單詞都符合最短完整詞的匹配條件時取單詞列表中最靠前的乙個。牌照中可能包含多個相同的字元,比如說 對於牌照 pp 單詞 pair 無法匹配,但是 supper 可以匹配。示例...
Leetcode 748 最短完整詞
如果單詞列表 words 中的乙個單詞包含牌照 licenseplate 中所有的字母,那麼我們稱之為完整詞。在所有完整詞中,最短的單詞我們稱之為最短完整詞。單詞在匹配牌照中的字母時不區分大小寫,比如牌照中的 p 依然可以匹配單詞中的 p 字母。我們保證一定存在乙個最短完整詞。當有多個單詞都符合最短...