给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串ransom能不能由第二个字符串magazines里面的字符构成。如果可以构成,返回 true ;否则返回 false。你可以假设两个字符串均只含有小写字母。
1. 先将字母全部放置入数组内,之后利用迭代器查询数组内的字母,如若不存在返回false,如若存在,则删除此字母
bool canConstruct(string ransomNote, string magazine) {
vector<int> a;
for(int i =0;i<magazine.size();i++)
{
a.push_back(magazine[i]);
}
for(int i =0;i<ransomNote.size();i++)
{
vector<int>::iterator vec;
vec = find(a.begin(),a.end(),ransomNote[i]);
if(vec == a.end())
{
return false;
}else
{
a.erase(vec);
}
}
return 1;
}
2. 使用map记录
unordered_map<char,int>map;
for(int i = 0;i<magazine.length();i++)
map[magazine[i]]+=1;
for(int i = 0;i<ransomNote.length();i++)
{
map[ransomNote[i]]-=1;
if(map[ransomNote[i]]<0) return false;
}
return true;
}
3. 使用数组记录
bool canConstruct(string ransomNote, string magazine){
int hash[26] = {0};
for(int i = 0;magazine[i];++i){
hash[magazine[i]-'a'] += 1;
}
for(int i = 0;ransomNote[i];++i){
hash[ransomNote[i]-'a'] -= 1;
if(hash[ransomNote[i] - 'a'] < 0)return false;
}
return true;
}
//简便写法
bool canConstruct(string ransomNote, string magazine) {
vector<int> mv(26, 0);
for(char c:magazine) mv[c - 'a']++;
for(char c:ransomNote) if (mv[c - 'a']-- == 0) return false;
return true;
}