2023-11-08
383. 赎金信 - 力扣(LeetCode)
思路:
1 暴力法:
遍历前者,从后者找到就从后者删除
2 哈希表法:
前者存入哈希表:循环一定要遍历完的,调用的库函数较多
class Solution { Map<Character,Integer> map=new HashMap<>(); public boolean canConstruct(String ransomNote, String magazine) { //简单的哈希表 //2个存入map好像都行,但是后者简单 前者循环要跑完的,后者可能不需要 //暴力法 从后者找到,就删除,继续找 //前者存入哈希表 for(int i=0;i<ransomNote.length();i++){ char now=ransomNote.charAt(i); map.put(now,map.getOrDefault(now,0)+1); } for(int i=0;i<magazine.length();i++){ char now=magazine.charAt(i); if(!map.containsKey(now)){ continue; } map.put(now,map.get(now)-1); if(map.get(now)==0){ map.remove(now); } } if(map.isEmpty()){ return true; } return false; } }
后者存入哈希表:循环可能不需要遍历完
class Solution { Map<Character,Integer> map=new HashMap<>(); public boolean canConstruct(String ransomNote, String magazine) { //简单的哈希表 //2个存入map好像都行,但是后者简单 前者循环要跑完的,后者可能不需要 for(int i=0;i<magazine.length();i++){ char now=magazine.charAt(i); map.put(now,map.getOrDefault(now,0)+1); } for(int i=0;i<ransomNote.length();i++){ char now=ransomNote.charAt(i); if(map.get(now)==null){ return false; } int x=map.get(now); if(x<=0){ return false; } map.put(now,map.get(now)-1); } return true; } }
3 因为题目都是小写字母,还可以用字符统计来写,2个数组,但是这种方法有局限性