题目: 给你两个字符串: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
思路:magazine中的字母不能重复使用,假设字符串中只有小写字母。暴力法:首先遍历magazine的字符串,从第一个开始,看是不是有对应的ransomNote 字符串中中的同样的字符,如果有,将ransomNote 字符串该处的字符设为字符0,最后判断ransomNote 字符串中是不是全是字符0。哈希法:首先判断两个字符串的长度,如果ransomNote 的字符串长度大于magazine 字符串长度,那么就不用比较了,否则,将magazine 字符串遍历,存到数组中,给对应数组位置减去字符a,表示存放的位置,再++表示存放了几个这样的字符,最后将ransomNote 字符串以同样的方式进行–的操作,没执行一步判断是不是减为了负数,如果没有返回true。
暴力法:
bool selectfun(string ransomNote, string magazine) {
for (int i = 0; i < magazine.size();i++) {
for (int j = 0; j < ransomNote.size();j++) {
if (magazine[i] == ransomNote[j]) {
ransomNote[j] = '0';
break;
}
}
}
for (int i = 0; i < ransomNote.size();i++) {
if (ransomNote[i] != '0') {
return false;
}
}
return true;
}
int main() {
string ransomNote = "ab";
string magazine = "b";
cout<<selectfun(ransomNote, magazine)<<endl;
return 0;
}
哈希法:
bool selectfun(string ransomNote, string magazine) {
int record[26] = { 0 };
if (ransomNote.size()>magazine.size()) {
return false;
}
for (int j = 0; j < magazine.size(); j++) {
record[magazine[j] - 'a']++;
}
for (int i = 0; i < ransomNote.size();i++) {
record[ransomNote[i]-'a']--;
if (record[ransomNote[i] - 'a']<0) {
return false;
}
}
return true;
}
int main() {
string ransomNote = "ab";
string magazine = "aaab";
cout<<selectfun(ransomNote, magazine)<<endl;
return 0;
}