给你两个字符串:ransomNote
和 magazine
,判断 ransomNote
能不能由 magazine
里面的字符构成。
如果可以,返回 true
;否则返回 false
。
magazine
中的每个字符只能在 ransomNote
中使用一次。
思路:将magazine
中字符及字符出现次数,存进map<key, value>中,遍历ransomNote 如果map中不存在ransomNote的字符就false,如果存在就把该字符value--,value<0,就false,如果成功过完循环,就true
时间复杂度:O(m + n)
空间复杂度:O(m)
public boolean canConstruct(String ransomNote, String magazine){
Map<Character, Integer> map = new HashMap<>();
char arr1 = ransomNote.toCharArray();
char arr2 = magazine.toCharArray();
for(char ch : arr1) map.put(ch, getOrDefault(ch, 0) + 1);
for(char ch : arr2) {
if(!map.containsKey(ch) || map.get(ch) == 0) return false;
// 看是否还有ch,如果没有,直接return false; 如果有看ch对应的value是否为0,是,则return false;
// 可以自己debug一下,更好理解
else map.put(ch, map.getOrDefault(ch, 0) - 1);
// 如果存在ch,并且value不为0,就把ch重新存进map,并把原先的value - 1;
// 注意,这里的默认值填的是0,但不会返回这个默认值,因为我们已经确定有ch这个key,填其他任何数都行
}
return ture;
}