刷刷刷Day7| 383. 赎金信

383. 赎金信

LeetCode题目要求

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

示例1

输入:ransomNote = "a", magazine = "b"
输出:false

示例2

输入:ransomNote = "aa", magazine = "aab"
输出:true
解题思路
  • 数组存储方式的解法

上代码

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
     
        // 判断 ransomNote 的字符串能不能由 magazine 的字符串组成
        // 由于字符都是小写字母,那么可以参考 字母异位 题通过数组方式实现
        // 数组大小为 26,将字符转为 ASCII 码,即可对应数组的下标,将 magazine 的字符数量放入数组中,
        // 然后遍历 ransomNote,将对应字符数量 --。
        // 最后判断数组中字符的数量判断,如果小于0 就说明不能构成

        int[] charCount = new int[26];

        for (int i = 0; i < magazine.length(); i++) {
            charCount[magazine.charAt(i) - 'a']++;
        }

        for (int i = 0; i < ransomNote.length(); i++) {
            charCount[ransomNote.charAt(i) - 'a']--;
        }

        for (int c : charCount) {
            if (c < 0) {
                return false;
            }
        }

        return true;
    }
}
  • map 存储方式的解法
    上代码
class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        Map<Character, Integer> map = new HashMap<>();

        // 判断 ransomNote 的字符串能不能由 magazine 的字符串组成
        // 可以借助 Map,首先将 magazine 的字符放入 map 中,
        // 然后遍历 ransomNote,判断是否在 map 中存在,如果存在就 -1, 
        // 如果对应的字符不在 map 中存在或者数量 < 0, 说明无法构成

        for (int i = 0; i < magazine.length(); i++) {
            map.merge(magazine.charAt(i), 1, Integer::sum);
        }

        for (int i = 0; i < ransomNote.length(); i++) {
            char c = ransomNote.charAt(i);
            if (!map.containsKey(c) || map.get(c) - 1 < 0) {
                return false;
            }
            map.put(c, map.get(c) - 1);
        }

        return true;
    }
}
重难点

附:学习资料链接

posted @ 2023-01-03 15:09  blacksonny  阅读(11)  评论(0编辑  收藏  举报