Leetcode 383. 赎金信(Ransom note)

发布时间 2023-08-27 23:49:02作者: Ahci

题目链接

给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。

如果可以,返回 true ;否则返回 false 。

magazine 中的每个字符只能在 ransomNote 中使用一次。

示例 1:

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

示例 2:

输入:ransomNote = "aa", magazine = "ab"
输出:false

提示:

  • 1 <= ransomNote.length, magazine.length <= 105
  • ransomNote 和 magazine 由小写英文字母组成

思路

这题的大意就是字符串A能否组成字符串B, 这里两个思路, 一个是使用HashMap将A串字符作为Key存入, Value是出现次数. 再用B减去.

第二种方法是使用数组也是类似的方法.

代码实现

HashMap:

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        Map<Character, Integer> map = new HashMap<>();
        for(char c : magazine.toCharArray()) {
            map.put(c, map.getOrDefault(c, 0) + 1);
        }

        for(char c : ransomNote.toCharArray()) {
            map.put(c, map.getOrDefault(c, 0) - 1);
            if(map.get(c) < 0) {
                return false;
            }
        }

        return true;
    }
}

数组:

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        int[] arr = new int[26];
        for(char c : magazine.toCharArray()) {
            arr[c - 'a'] += 1;
        }

        for(char c : ransomNote.toCharArray()) {
            arr[c - 'a'] -= 1;
        }

        for(int i : arr) {
            if(i < 0) {
                return false;
            }
        }

        return true;
    }
}