leetcode刷题记录(二十)——383. 赎金信
(一)问题描述
. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/ransom-note/description/
给你两个字符串: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
提示:
1 <= ransomNote.length, magazine.length <= 105
ransomNote
和magazine
由小写英文字母组成
(二)关键词提取
- magazine的字母在ransomNote中只能出现一次;
- resomNote和magazine都由小写英文字母组成,小写字母的数量是有限的的。
(三)解决思路
这道题和242.有效字母的异位词很像。这个问题实际是rasomNote的字母能否在magazine中都找到。找元素,哈希法。小写字母数量有限,并且映射关系很明确,就是使用ASCII:每个字母减去a就能得到连续的数组下标。
所以解决问题的思路是:用数组统计magazine中每个字母出现的次数,再遍历ransomNote,每个字母出现一次就在数组对应的位置上减去一。最后的结果数组中如果有元素小于0,说明magazine中的字母“不够用”,那么ransomNote就无法由magazine中的字母构成。
public boolean canConstruct(String ransomNote, String magazine) {//创建数组用来统计int[] records=new int[26];//统计magazine中的字符出现的次数for(int i=0;i<magazine.length();i++){records[magazine.charAt(i)-'a']+=1;}//遍历ransomNote,在数组对应位置减一for(int i=0;i<ransomNote.length();i++){records[ransomNote.charAt(i)-'a']-=1;if(records[ransomNote.charAt(i)-'a']<0){return false; //magazine中的元素不够用,返回false}}return true;}