目录
题干
给你两个字符串: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
解题思路
这道题与242.有效的字母异位词非常相似,事实上在解题思路上也几乎没有区别。
唯一的区别在于这次仅需要ransomNote的所有字符能够在magazine找到,因此我们在最后record数组的判断中的要求是不存在大于0的元素,因为如果magazine中包含ransomNote中所有的元素,那么数组中的元素只会有两种情况,等于0或者小于0,等于0对应在两个字符串都有的元素,小于0对应在magazine中而不在ransomNote中的元素。
完整代码如下:
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int record[26] = {0};
if(ransomNote.length() > magazine.length())
return false;
for(int i = 0; i < ransomNote.length(); i++){
record[ransomNote[i]-'a']++;
}
for(int j = 0; j < magazine.length(); j++){
record[magazine[j] - 'a']--;
}
for(int i=0; i<26; i++){
if(record[i] > 0)
return false;
}
return true;
}
};
以下是笔者在写代码时犯下的错误
for(int i=0; i<26; i++){
if(record[i] > 0)
return false;
else
return true;
}
误把 return true 放到了循环中,那么就会导致遍历一次就会返回true或 false
因此,正确的做法时把return true 放在循环后面,这样遍历完整个 record数组,排除所有return false的可能性后就可以 保证结果是true啦。