给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/ransom-note
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
有空再想其它办法叭。
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
if(ransomNote.size()>magazine.size())
return false;
vector<int> zim(26);
for(auto &c:magazine){
zim[c-'a']++;
}
for(auto &c:ransomNote){
zim[c-'a']--;
if(zim[c-'a']<0)
return false;
}
return true;
}
};
for(auto &c:magazine){
zim[c-'a']++;
}
用了auto 关键字,并对 magazine 容器中的每个元素 c 进行遍历(& 表示对元素进行地址引用,可以在循环中修改元素本身),然后执行下面的语句块。 对于每个字符 c,它会被转换为一个索引,该索引表示集合中字母的出现次数。具体来说,c - 'a' 将返回一个从 0 到 25 的整数,表示从 a 到 z 的字母。然后将 cnt 数组中对应的元素加 1,相当于统计数组中每个字母出现的次数。
for(auto &c:ransomNote){
zim[c-'a']--;
if(zim[c-'a']<0)
return false;
}
使用了类似的方式遍历 ransomNote 字符串中的每个字符 c 以减少 cnt 数组的相应计数器。如果任何字符的计数器变为负数,则表示 ransomNote 中出现了一个未在 magazine 中出现的字符,因此代码返回 false 表示匹配失败。如果没有这样的非法字符,则返回 true 表示匹配成功。