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
Subscribe to see which companies asked this question.
/*
* 问题转化为:ransomNote中的字母是否都是来自于magazine,且magazine中每个字母只能被使用一次。
* 因为题目中说了都是小写字符,所以借助一维数组Num来实现。
* Step1:首先判断特殊情况,如果ransomNote的长度大于magazine的长度,则返回false
* Step2:统计magazine中各个字符出现的次数;
* Step3:依次读ransomNote中的字母i,同时让Num[i-97]--,如果变为负数,则返回false;
* Step4:如果可以读完ransomNote的所有字母,且Num数组中各个元素都大于等于0,则返回true。
*/
public boolean canConstruct(String ransomNote, String magazine) {
int len1 = ransomNote.length();
int len2 = magazine.length();
/*Step1:首先判断特殊情况,如果ransomNote的长度大于magazine的长度,则返回false*/
if(len1 > len2){
return false;
}
/*Step2:统计magazine中各个字符出现的次数;*/
int[] Num = new int[26];
for(int i =0;i<len2;i++){
Num[magazine.charAt(i)-97]++;
}
/*Step3:依次读ransomNote中的字母i,同时让Num[i-67]--,如果变为负数,则返回false;*/
for(int i =0;i<len1;i++){
Num[ransomNote.charAt(i)-97]--;
if(Num[ransomNote.charAt(i)-97]<0){
return false;
}
}
/*Step4:如果可以读完ransomNote的所有字母,走到这一步则说明Num数组中各个元素都大于等于0,返回true。*/
return true;
}