赎金信
题目
给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。
(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。)
思路
- 字符串,且只用判断次数匹配与否,选用数组;
- magazine字符串,进行映射,映射一次对应位置++;
- 然后ransom字符串进行映射,如果某次映射产生负数,那么就是字符不够,返回
false
; - 如果完成映射,那么返回
true
代码
CPP
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
//数组初始化为0
int hash[26] = {0};
//magazine.size()也可以
for (int i = 0; i < magazine.length(); i++) {
hash[magazine[i] - 'a']++;
}
for (int i = 0; i < ransomNote.length(); i++) {
hash[ransomNote[i] - 'a']--;
// 这里判断条件不能乱写 if(hash[ransomNote[i] - 'a']--<0),因为是先判断才自减
if (hash[ransomNote[i] - 'a'] < 0) {
return false;
}
}
return true;
}
};
#include <iostream>
#include <vector>
using namespace std;
class Solution
{
public:
bool canConstruct(string ransomNote, string magazine)
{
vector<int> hash(26, 0);
for (int i = 0; i < ransomNote.size(); i++)
{
hash[ransomNote[i] - 'a']++;
}
for (int j = 0; j < magazine.size(); j++)
{
hash[magazine[j] - 'a']--;
}
for (int i = 0; i < hash.size(); i++)
{
if (hash[i] > 0)
return false;
}
return true;
}
};
int main()
{
Solution sol;
cout << sol.canConstruct("a", "b") << endl;
cout << sol.canConstruct("aa", "ab") << endl;
cout << sol.canConstruct("aa", "aab") << endl;
system("pause");
return 0;
}
Java
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
if (ransomNote.length() > magazine.length()) {
return false;
}
int[] hash = new int[28];
for (int i = 0; i < ransomNote.length(); i++) {
hash[ransomNote.charAt(i) - 'a']++;
}
for (int j = 0; j < magazine.length(); j++) {
hash[magazine.charAt(j) - 'a']--;
}
for (int i = 0; i < hash.length; i++) {
if (hash[i] > 0) {
return false;
}
}
return true;
}
}