import java.util.*;
import java.util.HashMap;
import java.util.Map;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param ransomNote string字符串 
     * @param magazine string字符串 
     * @return bool布尔型
     */
    public boolean canConstruct (String ransomNote, String magazine) {
        // write code here
       if(magazine.length()<ransomNote.length()) {
			return false;
		}
		HashMap<Character, Integer> map=new HashMap<>();
		HashMap<Character, Integer> map2=new HashMap<>();
		for (int i = 0; i < ransomNote.length(); i++) {
			map.put(ransomNote.charAt(i), map.getOrDefault(ransomNote.charAt(i), 0)+1);
		}
		for (int i = 0; i < magazine.length(); i++) {
			map2.put(magazine.charAt(i), map2.getOrDefault(magazine.charAt(i),0)+1);
		}
		for (Character c : map.keySet()) {
			if(map2.containsKey(c)) {
				if(map2.get(c)-map.get(c)<0) {
					return false;
				}
			}else {
				return false;
			}
		}
		return true;
		
    }
}

思路其实不难,拿两个哈希表来装这两个字符串中每个字符出现的字数,然后再遍历第一个哈希表的键,判断第二个哈希表是否包含该键,如果不包含就返回false;如果包含再判断第二个哈希表该键所对应的值是否足够,如果不足够就直接返回false;