LeetCode 383. Ransom Note 自己的解法

题目

这个Ransom Note不知道怎么翻译好,算了不用在意这些细节我们直接读题目吧。题目的大致意思是,给定一个字符串a,然后再给定一个字符串b,判断b能不能由a构建出来。假定字符串中字符都是小写。

分析

怎么理解这个构建呢,我的理解是,字符串b中必须含有字符串a中的字符,而且必须全部都有。而且,字符串b中含有字符串a中的字符的个数必须不小于字符串a中的个数。
这样我们就构造出两个判断条件:
1、字符串b的字符种类至少要和字符串a相同,可以多但是不能少;
2、字符串b含有字符串a中字符的个数至少要和字符串a相同;

代码

public class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
    //这里构造两个HashMap,
        Map<Character,Integer> map = new HashMap<>();
        Map<Character,Integer> buket = new HashMap<>();
        //得到ransomNote中所有字符的个数
        for(int i=0;i<ransomNote.length();i++){
            if(map.containsKey(ransomNote.charAt(i))){
                map.put(ransomNote.charAt(i),map.get(ransomNote.charAt(i))+1);
            }
            else{
                map.put(ransomNote.charAt(i),1);
            }
        }
        //同理,得到magazine中所有字符的个数
        for(int i=0;i<magazine.length();i++){
            if(buket.containsKey(magazine.charAt(i))){
                buket.put(magazine.charAt(i),buket.get(magazine.charAt(i))+1);
            }
            else{
                buket.put(magazine.charAt(i),1);
            }
        }
        //根据以上两个条件作出判断,
        for(Map.Entry<Character, Integer> entry : map.entrySet()){
            if(!buket.containsKey(entry.getKey())){
                return false;
            }
            if(buket.get(entry.getKey())<entry.getValue()){
                return false;
            }
        }
        return true;
    }
}

这个代码的时间复杂度是线性的,空间复杂度也是线性的。

猜你喜欢

转载自blog.csdn.net/ch_609583349/article/details/77869639
今日推荐