本人是高一年级奥赛生,正在刷题找手感,如若代码抽搐无法运行,请相信是我的原因,而不是你环境或者其他问题……感谢理解
题目
给你两个字符串: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 <= 10^5
两个字符串均为小写字母
题目分析
首先这是一道LeetCode上的算法题,只需要提交相关的代码即可。
因为1 <= ransomNote.length, magazine.length <= 10^5
,所以数据量不会很大,因此是入门级别。两个字符串均为小写字母,所以字符串由26个字符重复组成。我们可以定义一个数组,用于存储每个字符在magazine中出现的次数。并且减去在ransomNote中出现的次数。
定义一个数组:
int cnt[26]={0};
遍历字符串,记录字符的出现次数:
for (char & c : magazine) {
cnt[c-'a']++;
}
如果字符在ransonNote中出现的次数大于在magazine中农出现的次数,则不符合题意,返回FALSE:
for (char & c : ransomNote) {
cnt[c-'a']--;
if (cnt[c-'a'] < 0) {
return false;
}
}
值得注意的是,如果ransomNote的字符数大于magazine的字符数,那么肯定无法达到题目的要求因此要判断这种情况是否存在,如果存在直接返回FALSE。
if (ransomNote.size() > magazine.size()) {
return false;
}
完整代码
题解:
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
if (ransomNote.size() > magazine.size()) {
return false;
}
int cnt[26]={0};
for (char & c : magazine) {
cnt[c-'a']++;
}
for (char & c : ransomNote) {
cnt[c-'a']--;
if (cnt[c-'a'] < 0) {
return false;
}
}
return true;
}
};
完整程序:
#include<bits/stdc++.h>
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
if (ransomNote.size() > magazine.size()) {
return false;
}
int cnt[26]={0};
for (char & c : magazine) {
cnt[c-'a']++;
}
for (char & c : ransomNote) {
cnt[c-'a']--;
if (cnt[c-'a'] < 0) {
return false;
}
}
return true;
}
};
string stringToString(string input) {
assert(input.length() >= 2);
string result;
for (int i = 1; i < input.length() -1; i++) {
char currentChar = input[i];
if (input[i] == '\\') {
char nextChar = input[i+1];
switch (nextChar) {
case '\"': result.push_back('\"'); break;
case '/' : result.push_back('/'); break;
case '\\': result.push_back('\\'); break;
case 'b' : result.push_back('\b'); break;
case 'f' : result.push_back('\f'); break;
case 'r' : result.push_back('\r'); break;
case 'n' : result.push_back('\n'); break;
case 't' : result.push_back('\t'); break;
default: break;
}
i++;
} else {
result.push_back(currentChar);
}
}
return result;
}
string boolToString(bool input) {
return input ? "True" : "False";
}
int main() {
string line;
while (getline(cin, line)) {
string ransomNote = stringToString(line);
getline(cin, line);
string magazine = stringToString(line);
bool ret = Solution().canConstruct(ransomNote, magazine);
string out = boolToString(ret);
cout << out << endl;
}
return 0;
}
PS:衡中校园网真慢……