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
solution 1
解法思路和FirstUniqueCharacter一样,创建两个大小为26的array记录两个字符串中每个字符出现的次数,保证magazine总大于ransomNote
public boolean canConstruct(String ransomNote, String magazine) {
if (magazine == null || magazine.length() < ransomNote.length()) return false;
boolean res;
int[] ransom = new int[26];
int[] mag = new int[26];
for (int i = 0; i < ransomNote.length(); i++) {
ransom[ransomNote.charAt(i)-'a']++;
}
for (int j = 0; j < magazine.length(); j++) {
mag[magazine.charAt(j)-'a']++;
}
for (int k = 0; k < 26; k++) {
if (mag[k] < ransom[k]) return false;
}
return true;
}
solution 2
思路和上面解法一致,区别在于采用一个大小为26的array记录即可,每一次在magazine中出现一次就加一,在ransomNote中出现就减一,如果最后里面元素有小于一的失败,否则成功