2022.8.8今天你刷题了吗?
题目:
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
分析:
给定两个字符串,需要判断2号字符串是否包含了1号字符串,嗯,就是这么简单。
思路:直接在2号字符串中进行查找1号字符串,也就是遍历一次一号字符串,然后遍历时判断2号中有没有,如果没有直接返回false,如果有,则把该字符串替换,这样防止下次重复判断。
解析:
1.查找法
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
for (auto i = 0; i < ransomNote.size(); i++)
{
int pos = magazine.find(ransomNote[i]);
if (pos!=-1)
{
magazine[magazine.find(ransomNote[i])] = ' ';
}
else
{
return false;
}
}
return true;
}
};
2.计数法
官方的写法是:先把2号字符串中的26个字母的次数记下来,然后我们开始遍历一号字符串,如果1号字符串存在某一个元素,那么2号字符串中该元素次数-1,然后判断-1之后次数是否<0,也就是没有了
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
vector<int> vec(26);
for (auto &ch : magazine)
{
vec[ch - 'a']++;
}
for (auto& ch : ransomNote)
{
vec[ch - 'a']--;
if (vec[ch - 'a'] < 0)
{
return false;
}
}
return true;
}
};