数据结构与算法【LeetCode-Offer】:3.7哈希表—赎金信

这篇博客讨论了一种使用哈希表解决编程问题的策略,具体是关于检查能否使用给定的杂志中的单词拼出赎金信。作者提供了两种解决方案:一种使用HashMap存储字符计数,另一种使用数组下标对应字母。这两种方法都有效地检查了ransomNote中的每个字符是否能在magazine中找到足够的实例。
摘要由CSDN通过智能技术生成

赎金信

📃 题目描述

题目链接
在这里插入图片描述

🔔 解题思路

这题好办,对于快速找字符找数字这种题目,我们应该迅速想到哈希表。

利用一个 map 处理 magazine,key 存储字符,value 存储该字符出现的次数

然后遍历 ransomNote,若某个字符串存在于 map 中,则对应的 value - 1,在减 1 之前,如果 value 已经等于 0 了,意思就是说 magazine 中这个字符的数量已经不足以供 ransomNote 使用了,则立即返回 false;或者,ransomNote 的某个字符串不存在于 map 中,立即返回 false。

package com.kami.leetcode.hash_table;

import java.util.HashMap;

/**
 * @Description: TODO
 * @author: scott
 * @date: 2022年02月09日 10:10
 */
public class Solution_383 {

    public boolean canConstruct(String ransomNote, String magazine){
        if(magazine == null || magazine.length() == 0){
            return true;
        }else if(ransomNote == null || ransomNote.length() == 0){
            return false;
        }

        HashMap<Character, Integer> map = new HashMap<>();

        // 利用 map 处理 magazine,key 存储字符,value 存储该字符出现的次数
        for(char ch : magazine.toCharArray()){
            map.put(ch, map.getOrDefault(ch, 0) + 1);
        }

        // 遍历 ransomNote
        for(char ch : ransomNote.toCharArray()){
            // ransomNote 的某个字符串不存在于 map 中,立即返回 false
            if(!map.containsKey(ch)){
                return false;
            }

            // 在减 1 之前,如果 value 已经等于 0 了,则立即返回 false
            if(map.get(ch) == 0){
                return false;
            }

            map.put(ch, map.get(ch) - 1);
        }

        return true;
    }
}

在这里插入图片描述

242题目连接:
和 242. 有效的字母异位词 - 力扣(LeetCode) (leetcode-cn.com) (opens new window)一样,对于哈希表中的 key,如果哈希值比较连续且固定,我们可以用数组的下标来等同。这个题目中的 key 存储的就是 26 个字母,那我们只需要将其转成 int 作为数组的下标即可:

package com.kami.leetcode.hash_table;

/**
 * @Description: TODO
 * @author: scott
 * @date: 2022年02月09日 10:36
 */
public class Solution_383_one {

    public boolean canConstruct(String ransomNote, String magazine){

        if (magazine == null || magazine.length() == 0){
            return false;
        }else if(ransomNote == null || ransomNote.length() == 0){
            return false;
        }

        int[] nums = new int[26];

        // 利用 map 处理 magazine,key 存储字符,value 存储该字符出现的次数
        for(char ch : magazine.toCharArray()){
            nums[ch - 'a'] += 1;
        }

        // 遍历 ransomNote
        for(char ch : ransomNote.toCharArray()){
            // ransomNote 的某个字符串不存在于 map 中,立即返回 false
            // 在减 1 之前,如果 value 已经等于 0 了,则立即返回 false
            if(nums[ch - 'a'] == 0){
                return false;
            }

            nums[ch - 'a'] -= 1;
        }

        return true;
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狂野小白兔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值