383. 赎金信

发布时间 2023-11-08 10:34:47作者: 追梦•少年

​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个数组,但是这种方法有局限性