题目描述:
解题思路:
读完题目,我们发现只要magazine里面包含ransomNote里的所有元素即可。换句话说,就是magazine里面元素种类>=ransomNote的,并且magazine里面每种元素的数量>=ransomNote里面对应元素数量的。
解题方法:设计一个长度为26的数组(能够存放下所有种类元素,即26字母),统计magazine和ransomNote里面每个元素出现的个数。只要ransomNote有一个元素出现的次数大于magazine的,返回false。
代码实现如下:
这是优化之前的:
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
int[] r = new int[26];
int[] m = new int[26];
for (int i = 0;i < 26;i++) {
for (int j = 0;j < magazine.length();j++) {
if (magazine.charAt(j) - 97 == i) m[i]++;
}
}
for (int i = 0;i < 26;i++) {
for (int j = 0;j < ransomNote.length();j++) {
if (ransomNote.charAt(j) - 97 == i) r[i]++;
}
if (r[i] > m[i]) return false;
}
return true;
}
}
这是用了两个数组分别统计两个字符串的字符出现的个数,这样做浪费空间而且时间复杂度也较大,既然是比大小,而且都是在长度为26的数组里,我们不妨先计算出magazine每个字符出现的个数,然后遍历ransomNote,每遍历到一个字符就把magazine的对应字符的数量减一,如果magazine没有出现过该字符或者数量少了则为0或者负数,返回false。
代码实现如下:
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
int[] cnt = new int[26];
int[] m = new int[26];
for (char ch : magazine.toCharArray()) {
cnt[ch - 97]++;
}
for (char ch : ransomNote.toCharArray()) {
cnt[ch - 97]--;
if (cnt[ch - 97] < 0) return false;
}
return true;
}
}