赎金信
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ransom-note
示例 1:
输入:ransomNote = “a”, magazine = “b”
输出:false
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
if(ransomNote.length()>magazine.length())
return false;
boolean flag = true;
int[] nums = new int[26];
for(int i=0;i<magazine.length();i++){
nums[magazine.charAt(i)-'a']++;
}
for(int i=0;i<ransomNote.length();i++)
{
nums[ransomNote.charAt(i)-'a']--;
if(nums[ransomNote.charAt(i)-'a']<0)
{flag = false;
break;
}
}
return flag;
}
}
大致思路
1.先比较两个字符串的长度,如果magazine的长度比另一个还要小,说明肯定不可行,直接返回false;
2.新建数组,长度为26,存储26个字母的个数,遍历magazine字符串,将字母个数记录到数组中;
3.再遍历另一个字符串,只要遇到相同的字母就将数组值-1,并且判断数组值是否已经小于0,当小于0时,直接返回false,否则为true。
总结
1.在这里,要注意,每次不是对nums【i】进行判断,而是对已经进行完操作的nums【ransomNote.charAt(i)-‘a’】进行判断。
2.只需要一个数组即可,没必要再定义一个数组存储另一个字符串的字母个数,也没必要三次遍历。