题目描述:
给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串ransom能不能由第二个字符串magazines里面的字符构成。如果可以构成,返回 true ;否则返回 false。
(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。)
注意:
你可以假设两个字符串均只含有小写字母。
canConstruct("a", "b") -> false
canConstruct("aa", "ab") -> false
canConstruct("aa", "aab") -> true
分析:
第一种方法,把ransom和magazine分别排序,排好序后遍历random中每一个字母,遍历时可以设置一个 i 指针,每指向random一个元素,则到magazine中去寻找对应字符,同时magazine中也设置一个 j 指针,每次在magazine中寻找对应字符时都是从当前 j 指向的下标开始向后寻找,找到后指针后移一位,方便下次寻找,若没找到,则说明不存在,返回false。最后结束还没有返回false,则说明字母全都找到。
第二种方法,从别人那那学来的,思想比较巧妙。具体思路是统计magazine中包含的所有单词和对应的出现次数,接下来遍历ransom中每一个字母,再magazine中找到后,把出现次数减一,再判断次数是否还大于0,若小于0,说明magazine中没有这个字母或者相同的字母数不够,返回false,否则返回true。
代码:(第二种方法)
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
int [] res=new int[26];
for(int i=0;i<magazine.length();i++){
res[magazine.charAt(i)-'a']++;
}
for(int i=0;i<ransomNote.length();i++){
int k=--res[ransomNote.charAt(i)-'a'];
if(k<0)
return false;
}
return true;
}
}