返回

LeetCode 383:赎金信 -- Java版本

后端

使用哈希映射巧解 LeetCode 383:赎金信

什么是赎金信问题?

想象一下,你收到一封奇怪的信,里面只有剪切出来的杂志单词,没有连贯的句子。现在,你的任务是确定这封信是否能用提供的杂志单词拼写出来。这就是 LeetCode 383:赎金信问题的核心。

用哈希映射破解谜题

为了有效解决此问题,我们可以使用哈希映射,它本质上是一个存储键值对的数据结构。对于此问题,我们将使用哈希映射来存储杂志中的单词及其出现次数。

算法步骤

  1. 构建哈希映射: 遍历杂志中的单词,将每个单词及其出现次数添加到哈希映射中。
  2. 检查赎金信: 对于赎金信中的每个单词,检查它是否在哈希映射中。如果存在,则减少其出现次数;如果不存在,则返回 false。
  3. 确定可拼写性: 如果赎金信中的所有单词都在哈希映射中,且出现次数足以拼写赎金信,则返回 true;否则,返回 false。

代码示例

import java.util.HashMap;

class Solution {
    public boolean canConstruct(String[] magazine, String ransomNote) {
        // 创建哈希映射
        HashMap<String, Integer> magazineMap = new HashMap<>();

        // 构建哈希映射
        for (String word : magazine) {
            magazineMap.put(word, magazineMap.getOrDefault(word, 0) + 1);
        }

        // 检查赎金信
        for (String word : ransomNote.split("")) {
            // 如果单词存在,减少出现次数
            if (magazineMap.containsKey(word)) {
                int count = magazineMap.get(word);
                if (count > 0) {
                    magazineMap.put(word, count - 1);
                } else {
                    // 出现次数不足,返回 false
                    return false;
                }
            } else {
                // 单词不存在,返回 false
                return false;
            }
        }

        // 赎金信可拼写,返回 true
        return true;
    }
}

时间和空间复杂度

  • 时间复杂度:O(n),其中 n 是杂志中单词的数量。我们只遍历杂志和赎金信中的单词一次。
  • 空间复杂度:O(m),其中 m 是杂志中单词的数量。哈希映射存储杂志中的单词。

常见问题解答

  1. 如果杂志单词可以重复使用怎么办?
    哈希映射跟踪单词的出现次数,因此它可以处理重复的单词。

  2. 如果赎金信中的单词长度超过杂志中的单词长度怎么办?
    算法无法处理这种情况,因为它假设赎金信中的单词可以由杂志中的单词拼写。

  3. 如果杂志中存在冗余单词怎么办?
    冗余单词不会影响算法,因为哈希映射只跟踪每个单词的出现次数。

  4. 算法可以处理不含标点符号的赎金信吗?
    算法假设赎金信和杂志中的单词都是单个单词,不含标点符号。

  5. 算法可以处理空赎金信吗?
    算法将返回 true,因为空赎金信可以用任何数量的杂志单词拼写。

结论

通过使用哈希映射,我们可以高效地解决 LeetCode 383:赎金信问题。算法的时间和空间复杂度都较低,使其成为解决此问题的理想方法。通过理解算法并掌握哈希映射的使用,我们可以自信地解决类似的问题。