1.题目描述
给定两个字符串 ransomNote 和 magazine,如果 ransomNote 可以通过使用 magazine 中的字母构造出来,返回 true,否则返回 false。
magazine 中的每个字母只能使用一次。
示例 1:
输入:ransomNote = “a”, magazine = “b” 输出:false
示例 2:
输入:ransomNote = “aa”, magazine = “ab” 输出:false
示例 3:
输入:ransomNote = “aa”, magazine = “aab” 输出:true
2.思路
思路2:
维护一个magazine的数组,用字符之间的ASCII码值相减代表索引下标。然后如果magazine数组某字符一开始就为0说明,不足以提供足够的字符数量构造random数组的字符,所以返回false.
思路3:
什么时候返回 true?
返回 true 的情况是:
ransomNote 中的每个字符都能从 magazine 中找到,并且频次足够。即,ransomNote 中每个字母在 magazine 中的出现次数都不超过其实际的出现次数。
示例:
ransomNote = “aab”, magazine = “aab”:
m_cnt 会被更新为 [2, 1, 0, 0, …, 0]。
检查 ransomNote 的字符:
第一个 a,m_cnt[0] 为 2,减 1,更新为 1。
第二个 a,m_cnt[0] 为 1,减 1,更新为 0。
第三个 b,m_cnt[1] 为 1,减 1,更新为 0。
所有字符都能找到且满足要求,返回 true。
ransomNote = “abc”, magazine = “aab”:
m_cnt 会被更新为 [2, 1, 0, 0, …, 0]。
检查 ransomNote 的字符:
第一个 a,m_cnt[0] 为 2,减 1,更新为 1。
第二个 b,m_cnt[1] 为 1,减 1,更新为 0。
第三个 c,m_cnt[2] 为 0,无法找到足够的字符 c。
因为找不到字符 c,返回 false。
总结:
return true; 在最后的目的是,只有在 ransomNote 中的所有字符都能从 magazine 中找到并且数量足够时,才返回 true,表示可以构建出 ransomNote 字符串。如果在过程中发现某个字符无法满足要求(即 m_cnt[c - ‘a’] == 0),则立即返回 false。
3.代码实现
java">class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
//如果randsomNote的长度大于magazine的长度
if(ransomNote.length()>magazine.length())
{
return false;
}
int[] m_cnt=new int[26];
for(char c:magazine.toCharArray())
{
m_cnt[c-'a']++;//m_cnt数组,每个数组元素初始化是赋值为0,然后根据magazine里面出现的字母数,分别实现计数
}
for(char c:ransomNote.toCharArray())
{
if(m_cnt[c-'a']==0){return false;}
//magazine数组里面该元素本身就是0,说明magazine数组元素无法构造ran数组的元素
m_cnt[c-'a']--;
}
return true;
}
}