146.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

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;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值