383-赎金信
一、题目
给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。
(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。)
二、分析
该题类似: 有效的字母
只有小写字母,所以同样可以利用哈希数组解决此题
记录杂志串中字符出现的次数,然后遍历金信字符串,同时在记录数组中相应位减一
使用哈希表 采用数组存储
由于都是小写字母 所以采用数组存储即可 大小为26个字符;
-
首先遍历杂志(magazine)字符串
存储
各个元素出现次数到数组
中:// 计算在哈希表中存放位置下标 index = magazine.charAt(i) - 'a';
-
遍历赎金信 (ransom) 字符串 如果存在
相同字符
则数组对应位置次数减1
判断是否能由杂志(magazine)字符串里面的字符构成; 过程中如果次数更新后不大于0 则不存在 直接返回false; 遍历结束不存在次数更新后大于0的情况 则返回true。
三、算法
-
代码
class Solution { public boolean canConstruct(String ransomNote, String magazine) { // 使用哈希表 采用数组存储 // 由于都是小写字母 所以采用数组存储即可 大小为26个祖父 int[] arr = new int[26]; int index = 0; // 遍历杂志(magazine)字符串 存储各个元素出现次数到数组中 for(int i = 0; i < magazine.length(); i++){ // 计算在哈希表中存放位置下标 index = magazine.charAt(i) - 'a'; arr[index]++; } // 遍历赎金信 (ransom) 字符串 // 判断是否能由杂志(magazine)字符串里面的字符构成 for(int i = 0; i < ransomNote.length(); i++){ // 计算当前字符在哈希表中存放位置下标 index = ransomNote.charAt(i) - 'a'; if(arr[index] > 0){ arr[index]--; }else{ // 次数不大于0 则不存在 直接返回false return false; } } // 到此次数依然大于0 则返回false return true; } }
-
运行结果