A very typical application of hash maps. Since I am now learning Java, I code in Java. The following code uses toCharArray() and getOrDefault(), which are learnt from this post.
public class Solution { public boolean canConstruct(String ransomNote, String magazine) { HashMap<Character, Integer> map = new HashMap<>(); for (Character k : magazine.toCharArray()) { int v = map.getOrDefault(k, 0) + 1; map.put(k, v); } for (Character k : ransomNote.toCharArray()) { int v = map.getOrDefault(k, 0) - 1; if (v < 0) return false; map.put(k, v); } return true; } }
This code takes about 60ms.
In fact, arrays can be used to replace hash maps since the test cases of this problem only contan the 26 English letters. A array-version solution can be found here and is rewritten below.
public class Solution { public boolean canConstruct(String ransomNote, String magazine) { int[] map = new int[26]; for (char k : magazine.toCharArray()) map[k - 'a']++; for (char k : ransomNote.toCharArray()) { int v = --map[k - 'a']; if (v < 0) return false; } return true; } }
This version is much faster, about 13ms.