本文主要是介绍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;}
这篇关于146.Ransom Note的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!