很简单的一道题,判断a数组的字符能否由b数组的字符组成,且b数组的字符不可复用
思路:构建哈希map,key放字符,value放出现的次数,那么先遍历一遍b数组,若当前字符存在,则value + 1 ,若当前字符不存在则put进去;之后遍历a数组,若当前map中没有当前字符或者当前字符指向的数字为0,则直接返回false,否则当前字符指向的数字-1;遍历完返回true
优化:翻到下面,发现数组只有小数构成,这就更好做了,直接使用数组承担哈希表的功能,数组下标即为对应的ascill码%25的值,数组值即为出现次数
思路一实现代码(java)
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
//使用哈希map,key是字符,value是个数
Map<Character,Integer> map = new HashMap<>();
//遍历magazine,将字符输入进map里面
char[] m = magazine.toCharArray();
for (int i = 0; i < m.length; i++)
{
//若内部已存在
if (map.get(m[i]) != null)
{
map.put(m[i],map.get(m[i])+1);
}else
{
map.put(m[i],1);
}
}
//遍历ransomNote
char[] r = ransomNote.toCharArray();
for (char c : r)
{
//若不存在该字符,直接返回false
if (map.get(c) == null || map.get(c) == 0)
{
return false;
}
//若存在,该字符个数减1
map.put(c,map.get(c)-1);
}
return true;
}
}
优化后的代码(java):
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
//创建哈希数组
int[] nums = new int[26];
//遍历magazine,将字符输入进map里面
char[] m = magazine.toCharArray();
for (int i = 0; i < m.length; i++)
{
//对应位置++
nums[m[i]%25] ++;
}
//遍历ransomNote
char[] r = ransomNote.toCharArray();
for (char c : r)
{
//若为0,直接返回false
if (nums[c%25] == 0)
{
return false;
}
//若存在,该字符个数减1
nums[c%25]--;
}
return true;
}
}
事实证明哈希运算确实挺耗时间的