Leetcode383. 赎金信

发布于 2024-07-24  329 次阅读


最初的设想是统计各个字母出现的次数,来判断是否能组成所需的单词:

public boolean canConstruct(String ransomNote, String magazine) {
        char[] mag = magazine.toCharArray();
        Map<Character,Integer> map = new HashMap<>();
        for(char i:mag){
            if(!map.containsKey(i)){
                map.put(i,1);
            }
            else {
                map.put(i,map.get(i) + 1);
            }
        }
        char[] ran = ransomNote.toCharArray();
        for (char i:ran){
            if(!map.containsKey(i)){
                return false;
            }
            int num = map.get(i) - 1;
            if(num < 0){
                return false;
            }
            map.put(i,num);
        }
        return true;
    }

不出所料,耗时非常久,首先查看官方题解,发现思路核心是一致的,但是不需要用Map来存,因为Java中好久都没有使用过 char 类型了,就把这个技巧给忘记了

    public boolean canConstruct(String ransomNote, String magazine) {
        int[] c = new int[26];
        if(magazine.length() < ransomNote.length()){
            return false;
        }
        char[] mag = magazine.toCharArray();
        for(char n:mag){
            c[n-'a']++;
        }
        char[] ran = ransomNote.toCharArray();
        for (char n:ran){
            c[n-'a']--;
            if(c[n-'a'] < 0){
                return false;
            }
        }
        return true;
    }

这两种代码的思路核心是一致的,首先遍历 magazine 字符串,得到所有字母出现的次数,然后检查 ransomNote