题目描述
给定一个赎金信(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。