描述
给你两个字符串:ransomNote
和 magazine
,判断 ransomNote
能不能由 magazine
里面的字符构成。
如果可以,返回 true
;否则返回 false
。
magazine
中的每个字符只能在 ransomNote
中使用一次。
提示:
1 <= ransomNote.length, magazine.length <= 105
ransomNote
和magazine
由小写英文字母组成
示例
示例 1:
输入:ransomNote = "a", magazine = "b" 输出:false
示例 2:
输入:ransomNote = "aa", magazine = "ab" 输出:false
示例 3:
输入:ransomNote = "aa", magazine = "aab" 输出:true
算法思路1
本题给出两个字符串,要找ransomNote是否能由magazine构成,即为ransomNote中所有字符magazine中均有,且数量更多,要比较数量可以采用哈希表将两个字符串存储起来,健为字符元素,值为该字符在字符串中出现的次数,这样循环扫描ransomNote中字符在magazine中是否有,若没有或者数量更多,则返回false。
答案1
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
HashMap<Character,Integer> ran =new HashMap<>();
//哈希表健是字符,值是字符出现的次数
int []count = new int[ransomNote.length()];
for(int i=0;i<ransomNote.length();i++){
if(!ran.containsKey(ransomNote.charAt(i))){
count[i]=1;
ran.put(ransomNote.charAt(i),count[i]);
}else{
count[i]=ran.get(ransomNote.charAt(i))+1;
ran.replace(ransomNote.charAt(i),count[i]);
}
}
HashMap<Character,Integer> mag =new HashMap<>();
//哈希表健是字符,值是字符出现的次数
int []count1 = new int[magazine.length()];
for(int i=0;i<magazine.length();i++){
if(!mag.containsKey(magazine.charAt(i))){
count1[i]=1;
mag.put(magazine.charAt(i),count1[i]);
}else{
count1[i]=mag.get(magazine.charAt(i))+1;
mag.replace(magazine.charAt(i),count1[i]);
}
}
boolean result=true;
for(char c:ran.keySet()){
if(!mag.containsKey(c)||mag.get(c)<ran.get(c)){
result = false;
}
}
return result;
}
}
详解1
哈希表的使用详见Java“集合与列表”知识速成笔记学完就去实战(三)-CSDN博客
算法思路2
使用哈希表来解决这个问题。首先,遍历 magazine
字符串,将每个字符及其出现的次数存储在哈希表中。然后,遍历 ransomNote
字符串,检查每个字符是否在哈希表中,如果存在且次数大于0,则将该字符的出现次数减1。如果遍历完 ransomNote
字符串后,所有字符都能在哈希表中找到且出现次数都大于0,则返回 true
,否则返回 false
。
答案2
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
HashMap<Character, Integer> countMap = new HashMap<>();
// Count characters in magazine
for (char ch : magazine.toCharArray()) {
countMap.put(ch, countMap.getOrDefault(ch, 0) + 1);
}
// Check if ransomNote can be constructed
for (char ch : ransomNote.toCharArray()) {
if (!countMap.containsKey(ch) || countMap.get(ch) == 0) {
return false;
}
countMap.put(ch, countMap.get(ch) - 1);
}
return true;
}
}
这个方法就不用把ransomNote存到哈希表中了,简化操作。
关于getOrDefault(Object key, V defaultValue)方法,可见leetcode面试经典150题“169多数元素”Java解答-CSDN博客