day20赎金信

文章介绍了两种方法来解决赎金信问题,一种是使用哈希表记录杂志中的字母频率,然后遍历赎金信检查是否有足够的字母;另一种是用数组代替哈希表,同样跟踪字母出现次数。两种方法均检查赎金信是否能用杂志中的字母构建。
摘要由CSDN通过智能技术生成

1.题目描述

题目链接:383. 赎金信

2.题解

i.哈希法

利用哈希表的特性,将magazine存入一个哈希表,记录字母和出现次数,接着遍历ransomNote判断哈希表中是否含有所有ransomNote中的元素,而判断操作细节是将哈希表中和遍历到的ransomNote元素一样的键值对的值(即出现个数)减一,直到小于零。

ii.数组法

创建一个数组来代替哈希表,长度为26(代表26个字母),每个元素代表出现的个数。其余的操作与哈希表类似。

3.代码示例

i.哈希法

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        char[] rNote=ransomNote.toCharArray();
        char[] mNote=magazine.toCharArray();
        Map<Character,Integer> mNoteMap=new HashMap<>();
        mNoteMap=toHashMap(mNote);
        int count=0;
        //判断操作
        for(int i=0;i<rNote.length;i++){
            if(mNoteMap.containsKey(rNote[i])){
                count=mNoteMap.get(rNote[i]);
                if(count>0)
                    mNoteMap.put(rNote[i],--count);
                else
                    return false;
            }
            else
                return false;
        }
        return true;
    }
    //定义一个方法实现将数组转成哈希表的功能
    public Map toHashMap(char[] inChar){
        Map<Character,Integer> result=new HashMap<>();
        int count=1;
        int temp=0;
        for(int i=0;i<inChar.length;i++){
            if(result.containsKey(inChar[i])){
                temp=result.get(inChar[i]);
                result.put(inChar[i],++temp);
            }
            else
                result.put(inChar[i],1);
        }
        return result;
    }
}

ii.数组法

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
    int[] mArr=new int[26];//代替哈希表的数组
    //将magazine中的元素存入数组
    for(char m:magazine.toCharArray()){
        mArr[m-'a']++;
    }
    //判断操作
    for(char r:ransomNote.toCharArray()){
        if(mArr[r-'a']<=0)
            return false;
        else
            mArr[r-'a']--;
    }
    return true;
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值