748. Shortest Completing Word

Find the minimum length word from a given dictionary words, which has all the letters from the string licensePlate. Such a word is said to complete the given string licensePlate

Here, for letters we ignore case. For example, "P" on the licensePlate still matches "p" on the word.

It is guaranteed an answer exists. If there are multiple answers, return the one that occurs first in the array.

The license plate might have the same letter occurring multiple times. For example, given a licensePlate of "PP", the word "pair" does not complete the licensePlate, but the word "supper" does.

Example 1:

Input: licensePlate = "1s3 PSt", words = ["step", "steps", "stripe", "stepple"]
Output: "steps"
Explanation: The smallest length word that contains the letters "S", "P", "S", and "T".
Note that the answer is not "step", because the letter "s" must occur in the word twice.
Also note that we ignored case for the purposes of comparing whether a letter exists in the word.

Example 2:

Input: licensePlate = "1s3 456", words = ["looks", "pest", "stew", "show"]
Output: "pest"
Explanation: There are 3 smallest length words that contains the letters "s".
We return the one that occurred first.

Note:
licensePlate will be a string with length in range [1, 7].
licensePlate will contain digits, spaces, or letters (uppercase or lowercase).
words will have a length in the range [10, 1000].
Every words[i] will consist of lowercase letters, and have length in range [1, 15].

思路:(看討論的,叫做直方圖解法,特別巧妙)

class Solution {
    inline bool metLicense(vector<int> vec) {  //判斷vec中是否存在>0的元素
        for (auto i : vec) {
            if (i > 0) 
                return false;  //細節:注意一定要>0, !=0都不行.
        }                      //因為題目要求的是plate里面出現的一定要滿足,但不限制出現plate以外的字符.
        return true;
    }
public:
    string shortestCompletingWord(string licensePlate, vector<string>& words) {
        string res;
        vector<int> dict(26);
        for (auto c : licensePlate) { //將plate出現的字符映射到dict數組的0~25號位置,
            if (isalpha(c)) //若是字符
                dict[tolower(c) - 'a']++;  //全部轉為小寫,檢測到一個,相應位置就+1
        }
        for (auto s : words) {  //遍歷每個string
            vector<int> tmp = dict; //tmp復制dict,用于檢測
            for (auto c : s) {  //對string的每個字符
                if (isalpha(c)) tmp[tolower(c) - 'a']--;  //tmp相應位置-1
            }
            //借助輔助函數metLicense判斷是否滿足要求
            //此外若發現更短的串,或者是初始串的時候
            if (metLicense(tmp) && (s.length() < res.length() || res.length() == 0))
                res = s;
        }
        return res;
    }
};
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • **2014真題Directions:Read the following text. Choose the be...
    又是夜半驚坐起閱讀 9,934評論 0 23
  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,776評論 0 33
  • 上帝之眼,看見自己,看見別人! 不行動,無改變!
    風清楊閱讀 183評論 0 1
  • 看左看右,是誰與你結伴同行?向前向后,又是誰在阻你前進? 若人生是綻放的花蕾,你是萬般呵護下的花蕊,雍容華貴,熠熠...
    喬巧一汀閱讀 185評論 2 3
  • 回到家,又被臭罵,看來今天是沒心情寫字了。 不能把工作帶到家里來,和家長微信溝通。孩子爹鬧意見,沒人陪他。 哎,今...
    我是慕一閱讀 131評論 0 0