iT邦幫忙

2024 iThome 鐵人賽

0
佛心分享-刷題不只是刷題

刷經典 LeetCode 題目系列 第 42

經典LeetCode 383. Ransom Note

  • 分享至 

  • xImage
  •  

題目:
在這篇文章中,我們將探討 LeetCode 383:Ransom Note,並解釋如何有效地解決這個問題。題目要求我們判斷,給定的 ransomNote 是否可以用 magazine 中的字母構成。每個字母只能使用一次,因此我們需要確保 magazine 中的字母數量足夠。

題目給了我們兩個字串 ransomNotemagazine,並要求判斷 ransomNote 中的每個字母在 magazine 中是否有相同或更多的出現次數。也就是說,magazine 中必須包含 ransomNote 的所有字母,並且每個字母的出現次數不得少於 ransomNote

範例:

  • 例 1ransomNote = "a"magazine = "b" → 回傳 false,因為 magazine 中沒有字母 "a"。
  • 例 2ransomNote = "aa"magazine = "ab" → 回傳 false,因為 magazine 中只有一個 "a"。
  • 例 3ransomNote = "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;
    }
};

參考:
#383. Ransom Note


上一篇
經典LeetCode 169. Majority Element
下一篇
經典LeetCode 110. Balanced Binary Tree
系列文
刷經典 LeetCode 題目80
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言