「这是我参与2022首次更文挑战的第35天,活动详情查看:2022首次更文挑战」。
赎金信
题目描述
给你两个字符串:ransomNote
和magazine
,判断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;
}
}
复制代码