题目:
https://leetcode-cn.com/problems/ransom-note/
题解:哈希表
将杂志(magazine)中所有字符构建成一张哈希表,遍历
赎金信 (ransom
) 中的字符,如果不能哈希表中获取到,证明 ransom 不能由 magazine 组成,时间复杂度:O(n^2)
public boolean canConstruct(String ransomNote, String magazine) {
Map<Character, Integer> charToCountMap = new HashMap<>();
for (char c :magazine.toCharArray()){
int count = charToCountMap.getOrDefault(c, 0) + 1;
charToCountMap.put(c, count);
}
for (char c : ransomNote.toCharArray()) {
Integer count = charToCountMap.get(c);
if (count == null) {
return false;
}
count--;
charToCountMap.put(c, count);
if (count == 0) {
charToCountMap.remove(c);
}
}
return true;
}
由于题目中说了两个字符串中只有小写字母,所以这里哈希表可以用一个长度为26的数组代替,数组的索引是小写字母的相对字符a的位置,数组的值为当前字母出现的次数。
public boolean canConstruct(String ransomNote, String magazine) {
int[] indexArr = new int[26];
for (char c : magazine.toCharArray()) {
indexArr[c - 'a']++;
}
for (char c : ransomNote.toCharArray()) {
int count = indexArr[c - 'a'];
if (count <= 0) {
return false;
}
indexArr[c - 'a']--;
}
return true;
}