春招刷题 - 383. 赎金信

85 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

383. 赎金信

给你两个字符串:ransomNotemagazine ,判断 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;

    }
}

范文参考

赎金信 - 赎金信 - 力扣(LeetCode) (leetcode-cn.com)