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;
}
};