力扣-赎金信

「这是我参与2022首次更文挑战的第35天,活动详情查看:2022首次更文挑战」。

赎金信

题目描述

给你两个字符串:ransomNotemagazine,判断ransomNote能不能由magazine里面的字符构成。
如果可以,返回true;否则返回false
magazine中的每个字符只能在ransomNote中使用一次。
示例1:

输入: ransomNote = "a", magazine = "b"
输出: false
复制代码

示例2:

输入: ransomNote = "aa", magazine = "ab"
输出: false
复制代码

示例3:

输入: ransomNote = "aa", magazine = "aab"
输出: true
复制代码

算法解析

本题实质上是考察哈希表的运用。因为一般情况下,哈希表都是用来快速判断一个元素是否出现在集合里,在本题中,其实就是判断字符串ransomNote的各个元素是否包含在magazine的元素组成的集合里,既然这里用到了哈希解法,那我们就先来学习一下哈希表的相关概念知识吧!
哈希的基本思想:

在记录的关键码和存储地址之间建立一个确定的对应关系,通过计算得到待查记录的地址。
哈希表:采用哈希技术寻出查找集合的连续存储空间。
哈希函数:将关键码映射为哈希表中适当存储位置的函数。
哈希地址:由哈希函数所得的存储地址。

在本题中,判断字符串ransomNote的元素是否被magazine中的元素集合包含,首先我们就要构造一个包含26个字母的数组hash。然后遍历两个字符串,同时在数组hash里面作如下操作:
1.首先将magazine里面的字符串转换成字符数组,这里的关键码为26个英文子母,然后对字符数组依次进行遍历,在字母下面填写该字母出现的次数。
2.将ransomNote里面的字符串转化成字符数组,依次进行遍历:
当遍历到ransomNote中的字母出现次数大于0时,将该数字减去1,若小于等于0则返回false

代码解析

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        //创建一个包含26个英文单词的数组hash
        int[] hash=new int[26];
        //遍历magazine,在对应的字母下填入出现次数
        for(char c:magazine.toCharArray()){
            hash[c-'a']++;
        }
        //遍历ransomNote
        for(char c:ransomNote.toCharArray()){
            //遍历的字母中先前出现次数大于0的,将出现次数减去1,否则返回false
            if(hash[c-'a']>0){
                hash[c-'a']--;
            }else{
                return false;
            }
        }
        return true;
    }
}
复制代码

Guess you like

Origin juejin.im/post/7067111947186995208