算法修炼之路—【字符串】Leetcode 383 赎金信

题目描述

给定一个赎金信(ransom)字符串和一个杂志字符串,判断第一个字符串能不能由第二个字符串里面的字符构成。如果可以构成,返回true;否则返回false;

题目说明:为了不暴露赎金信自己,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符中使用一次。

注意: 你可以假设两个字符串均含有小写字母。

canConstruct(“a”, “b”) -> false
canConstruct(“aa”, “ab”) -> false
canConstruct(“aa”, “aab”) -> true

思路分析

难度是简单 ,简单理解就是需要对两个字符串分别遍历,杂志字符串mgze需要对遍历进行记忆:先对mgze进行遍历,这里我们选用HashMap<Character, Integer> ==> map)进行存储字符以及相应的个数,因为题干中说明字符使用具有个数对应性质;之后对ransom进行遍历,当存在不包含在map中时,直接返回false,否则对map中的值进行减1map.get(c) - 1,这里直接给出代码:

解题代码

    public static boolean solution(String ransom, String mgze) {
        if(ransom == null || mgze == null) return false;
        
        Map<Character, Integer> map = new HashMap<>();
        
        for(char c : mgze.toCharArray()){
            if(!map.containsKey(c))
                map.put(c, 1);
            else
                map.replace(c, map.get(c)+ 1);
        }
        
        for(char c : ransom.toCharArray()){
            if(!map.containsKey(c)){
                return false;
            }
            
            map.replace(c,map.get(c) - 1);
            if(map.get(c) == 0) map.remove(c);
        }
        
        return true;
    }

复杂度分析

这里我们设m, n为输入字符数组ransom, mgze的长度;

时间复杂度: 我们对输入的字符串均进行了一次遍历,故时间复杂度为O(m, n);
空间复杂度: 我们使用了map存储mgze的字符出现及频率情况, 故空间复杂度为O(m);

Github源码

完整可运行文件请访问GitHub

猜你喜欢

转载自blog.csdn.net/u011106767/article/details/105921447
今日推荐