383. Ransom Note
Given an arbitrary ransom note string and another string containing letters from all the magazines, write a function that will return true if the ransom note can be constructed from the magazines ; otherwise, it will return false.
Each letter in the magazine string can only be used once in your ransom note.
Note:
You may assume that both strings contain only lowercase letters.
canConstruct("a", "b") -> false
canConstruct("aa", "ab") -> false
canConstruct("aa", "aab") -> true
解法一
判断ransomNote中每个字母出现的次数是否大于magazine中该字母出现的次数。
public class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
if (ransomNote == null || magazine == null) {
return false;
}
int[] indexR = new int[26];
int[] indexM = new int[26];
for (int i = 0; i < ransomNote.length(); i++) {
indexR[ransomNote.charAt(i) - 'a']++;
}
for (int j = 0; j < magazine.length(); j++) {
indexM[magazine.charAt(j) - 'a']++;
}
for (int k = 0; k < 26; k++) {
if (indexR[k] > indexM[k]) {
return false;
}
}
return true;
}
}
解法二
使用一个数组,先计算magazine中的字符的个数,然后在ransomNote中判断够不够用。
public class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
if (ransomNote == null || magazine == null) {
return false;
}
int[] index = new int[26];
for (int i = 0; i < magazine.length(); i++) {
index[magazine.charAt(i) - 'a']++;
}
for (int j = 0; j < ransomNote.length(); j++) {
if (--index[ransomNote.charAt(j) - 'a'] < 0) {
return false;
}
}
return true;
}
}
解法三
字符串先变成字符串数组,性能提升。
public class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
if (ransomNote == null || magazine == null) {
return false;
}
int[] table = new int[26];
for (char c : magazine.toCharArray()) {
table[c - 'a']++;
}
for (char c : ransomNote.toCharArray()) {
if (--table[c - 'a'] < 0) {
return false;
}
}
return true;
}
}