您的位置:首页 > 其它

LeetCode 383. Ransom Note 自己的解法

2017-09-06 18:02 351 查看

题目

这个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;
}
}


这个代码的时间复杂度是线性的,空间复杂度也是线性的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode