Easy
359136FavoriteShare
Given an arbitrary ransom note string and another string containing letters from all the magazines, write a function that will return true if the ransom note can be constructed from the magazines ; otherwise, it will return false.
Each letter in the magazine string can only be used once in your ransom note.
Note:
You may assume that both strings contain only lowercase letters.
canConstruct("a", "b") -> false
canConstruct("aa", "ab") -> false
canConstruct("aa", "aab") -> true
C++:
/*
* @Autor: SourDumplings
* @Date: 2019-09-18 22:12:03
* @Link: https://github.com/SourDumplings/
* @Email: changzheng300@foxmail.com
* @Description: https://leetcode.com/problems/ransom-note/
*/
class Solution
{
public:
bool canConstruct(string ransomNote, string magazine)
{
unordered_map<char, int> m;
for (auto &&c : magazine)
{
if (m.find(c) == m.end())
{
m[c] = 1;
}
else
{
++m[c];
}
}
for (auto &&c : ransomNote)
{
if (m.find(c) == m.end() || m[c] == 0)
{
return false;
}
else
{
--m[c];
}
}
return true;
}
};
Java:
import java.util.Hashtable;
import java.util.Map;
/*
* @Autor: SourDumplings
* @Date: 2019-09-18 22:16:52
* @Link: https://github.com/SourDumplings/
* @Email: changzheng300@foxmail.com
* @Description: https://leetcode.com/problems/ransom-note/
*/
class Solution
{
public boolean canConstruct(String ransomNote, String magazine)
{
Map<Character, Integer> map = new Hashtable<>();
int l1 = ransomNote.length();
int l2 = magazine.length();
for (int i = 0; i < l2; i++)
{
char c = magazine.charAt(i);
if (map.containsKey(c))
{
map.put(c, map.get(c) + 1);
}
else
{
map.put(c, 1);
}
}
for (int i = 0; i < l1; i++)
{
char c = ransomNote.charAt(i);
if (!map.containsKey(c) || map.get(c) == 0)
{
return false;
}
else
{
map.put(c, map.get(c) - 1);
}
}
return true;
}
}