題目:
在這篇文章中,我們將探討 LeetCode 383:Ransom Note,並解釋如何有效地解決這個問題。題目要求我們判斷,給定的 ransomNote 是否可以用 magazine 中的字母構成。每個字母只能使用一次,因此我們需要確保 magazine 中的字母數量足夠。
題目給了我們兩個字串 ransomNote 和 magazine,並要求判斷 ransomNote 中的每個字母在 magazine 中是否有相同或更多的出現次數。也就是說,magazine 中必須包含 ransomNote 的所有字母,並且每個字母的出現次數不得少於 ransomNote。
範例:
ransomNote = "a",magazine = "b" → 回傳 false,因為 magazine 中沒有字母 "a"。ransomNote = "aa",magazine = "ab" → 回傳 false,因為 magazine 中只有一個 "a"。ransomNote = "aa",magazine = "aab" → 回傳 true,因為 magazine 中有足夠的 "a" 來構成 ransomNote。用一個 hash table 裝進 magazine 每個字母出現的次數,然後遍歷 ransomNote 對每個字母去檢查 hash table 有沒有存在,有的話次數就減 1,否則就直接回傳 false,遍歷完表示符合條件回傳 true。
實作:
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
unordered_map<char, int> map;
for (auto c : magazine) {
map[c]++;
}
for (auto c : ransomNote) {
if (map.count(c) > 0 && map[c] > 0) {
//if (map.find(c) != map.end() && map[c] > 0) {
map[c]--;
} else {
return false;
}
}
return true;
}
};
不用 hash table 用陣列實做,
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
vector<int> count(26, 0);
for (auto c : magazine) {
count[c - 'a']++;
}
for (auto c : ransomNote) {
if (count[c - 'a'] > 0) {
count[c - 'a']--;
} else {
return false;
}
}
return true;
}
};