Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
示例 1:
输入:ransomNote = "a", magazine = "b"
输出:false
示例 2:
输入:ransomNote = "aa", magazine = "ab"
输出:false
示例 3:
输入:ransomNote = "aa", magazine = "aab"
输出:true
提示:
- 1 <= ransomNote.length, magazine.length <= 10^5
- ransomNote 和 magazine 由小写英文字母组成
二、思路分析:
此题用哈希map没用数组好,因为此题的数组长度最大值是可以确定的。但写此题时也遇到了一些新知识,需要记录一下。首先,字符串的长度需要用string.length(),如果想获取字符串中某个位置的字符串,应该用string.substring(),其中参数为开始和结尾,如果用string.charAt(),我们获得的是一个char型。最后,哈希map如果其中参数要放char,应该放Character。此题的思路和用数组解决的思路一样。
三、AC 代码:
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
Map<String,Integer> map = new HashMap<String,Integer>();
int n = magazine.length();
int m = ransomNote.length();
for(int i = 0;i < n;i++){
if(map.containsKey(magazine.substring(i,i+1))){
map.put(magazine.substring(i,i+1),map.get(magazine.substring(i,i+1))+1);
}else{
map.put(magazine.substring(i,i+1),1);
}
}
for(int j = 0;j < m;j++){
if(map.containsKey(ransomNote.substring(j,j+1))){
map.put(ransomNote.substring(j,j+1),map.get(ransomNote.substring(j,j+1))-1);
if((map.get(ransomNote.substring(j,j+1))) < 0){
return false;
}
}else{
return false;
}
}return true;
}
}
范文参考: