题目链接:383. 赎金信
题目:
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
示例 1:
输入:ransomNote = “a”, magazine = “b”
输出:false
示例 2:
输入:ransomNote = “aa”, magazine = “ab”
输出:false
示例 3:
输入:ransomNote = “aa”, magazine = “aab”
输出:true
提示:
- 1 <= ransomNote.length, magazine.length <= 105
- ransomNote 和 magazine 由小写英文字母组成
思路和算法:
这题和242题思路差不多,采用哈希表。
首先用一个哈希表
h
a
s
h
hash
hash 插入字符串
m
a
g
a
z
i
n
e
magazine
magazine 中的所有元素,其中
h
a
s
h
hash
hash 表的
k
e
y
key
key 值为字符串
m
a
g
a
z
i
n
e
magazine
magazine 中的字符,
v
a
l
u
e
value
value 值为字符出现的次数。然后依次遍历字符串
r
a
n
s
o
m
N
o
t
e
ransomNote
ransomNote 中的字符,通过
h
a
s
h
hash
hash 的
c
o
u
n
t
count
count 方法来判断字符是否存在,如果存在,则
k
e
y
key
key 值对应得
v
a
l
u
e
value
value 值减一。此时如果
v
a
l
u
e
value
value 值为负数,则代表
m
a
g
a
z
i
n
e
magazine
magazine 中该字符出现次数少于
r
a
n
s
o
m
N
o
t
e
ransomNote
ransomNote 中的,返回
f
a
l
s
e
false
false ;如果用
c
o
u
n
t
count
count 方法判断不存在,则直接返回
f
a
l
s
e
false
false 。
代码(c++):
//哈希表
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
if (ransomNote.length() > magazine.length()) return false;
unordered_map<char, int> hash; //存放magazine中的字符和出现次数
for (char ch : magazine) {
if (hash.count(ch)) //如果字符存在,则出现次数value值加1
hash[ch] += 1;
else
hash[ch] = 1; //不存在则插入字符
}
for (char ch : ransomNote) {
if (hash.count(ch)) { //如果字符存在,则对应的value值减1
hash[ch] -= 1;
if (hash[ch] < 0) return false;
}
else return false; //不存在返回false
}
return true;
}
};