首页 > 其他分享 >Leetcode 383.赎金信

Leetcode 383.赎金信

时间:2024-10-21 22:46:19浏览次数:3  
标签:ransomNote 字符 hash 返回 magazine 383 赎金 false Leetcode

问题描述

给你两个字符串: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

LeetCode链接

解决思路

哈希法

  1. 哈希表 charCount:用于统计 magazine 中每个字符的出现次数。
  2. 统计 magazine 中字符的出现次数:遍历 magazine 中的每个字符,将其出现次数记录在 charCount 中。
  3. 检查 ransomNote 中的字符:遍历 ransomNote 中的每个字符,检查其在 charCount 中是否有足够的数量。如果有,则减少其数量;如果没有,则返回 false
  4. 返回结果:如果 ransomNote 中的所有字符都能在 magazine 中找到足够的数量,则返回 true,否则返回 false

hash数组法

  1. 初始化数组
    • 使用一个长度为 26 的数组 hash 来统计 magazine 中每个字符的出现次数。数组的索引对应于字符 'a''z',即 hash[0] 对应 'a'hash[1] 对应 'b',依此类推。
  2. 检查长度
    • 如果 ransomNote 的长度大于 magazine 的长度,直接返回 false。因为 magazine 中的字符数量不足以构成 ransomNote
  3. 统计 magazine 中字符的出现次数
    • 遍历 magazine 中的每个字符,将其出现次数记录在 hash 数组中。具体来说,对于字符 c,将其出现次数记录在 hash[c - 'a'] 中。
  4. 检查 ransomNote 中的字符
    • 遍历 ransomNote 中的每个字符,检查其在 hash 数组中是否有足够的数量。具体来说,对于字符 c,将其对应的 hash[c - 'a'] 减 1。如果减 1 后 hash[c - 'a'] 小于 0,说明 magazine 中没有足够的字符 c,返回 false
  5. 返回结果
    • 如果 ransomNote 中的所有字符都能在 magazine 中找到足够的数量,则返回 true,否则返回 false

code

哈希法

class Solution {

    public boolean canConstruct2(String ransomNote, String magazine) {
        // 创建一个哈希表来统计 magazine 中每个字符的出现次数
        HashMap<Character, Integer> hashMap = new HashMap<>();

        // ramsonNote 的长度大于magazine的长度,直接返回false
        if(ransomNote.length() > magazine.length()){
            return false;
        }

        // 统计 magazine 中每个字符的出现次数
        for (char c : magazine.toCharArray()) {
            hashMap.put(c,hashMap.getOrDefault(c,0) + 1);
        }

        // 检查 ransomNote 中的每个字符是否在 magazine 中有足够的数量
        for (char c : ransomNote.toCharArray()) {
            // 如果 magazine 中没有该字符或数量不足,返回 false
            if(!hashMap.containsKey(c)|| hashMap.get(c) == 0){
                return false;
            }
            // 使用一个字符后,减少其数量
            hashMap.put(c,hashMap.get(c) - 1);
        }

        // 如果所有字符都满足条件,返回 true
        return true;
    }
}

hash数组法

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        // 初始化hash数组,默认长度26
        int[] hash = new int[26];
        // ramsonNote 的长度大于magazine的长度,直接返回false
        if(ransomNote.length() > magazine.length()){
            return false;
        }
        // 统计 magazine 中字符的出现次数
        for (int i = 0; i < magazine.length(); i++) {
            hash[magazine.charAt(i) - 'a']++;
        }

        // 检查 ransomNote 中的字符
        for (int i = 0; i < ransomNote.length(); i++) {
            hash[ransomNote.charAt(i) - 'a']--;
            if(hash[ransomNote.charAt(i) - 'a'] < 0){
                return false;
            }
        }
        // 返回结果
        return true;
    }
}

参考链接

383.赎金信

标签:ransomNote,字符,hash,返回,magazine,383,赎金,false,Leetcode
From: https://blog.csdn.net/gaosw0521/article/details/143114476

相关文章

  • LeetCode题练习与总结:区间和的个数--327
    一、题目描述给你一个整数数组 nums 以及两个整数 lower 和 upper 。求数组中,值位于范围 [lower,upper] (包含 lower 和 upper)之内的 区间和的个数 。区间和 S(i,j) 表示在 nums 中,位置从 i 到 j 的元素之和,包含 i 和 j (i ≤ j)。示例1:输入......
  • LeetCode题练习与总结:奇偶链表--328
    一、题目描述给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。你必须在 ......
  • Leetcode 328. Odd Even Linked List
    我的解法没有什么需要推理的地方,要注意一开始要让cur走的比odd和even快,否则会导致cur的next被odd和even修改,代码里有注释。ListNode*oddEvenList(ListNode*head){if(!head){returnhead;}ListNode*cur=nullptr,*headofOdd=h......
  • 代码随想录算法训练营第六天| leetcode242.有效的字母异位词、leetcode349.两个数组的
    1.leetcode242.有效的字母异位词题目链接:242.有效的字母异位词-力扣(LeetCode)文章链接:代码随想录视频链接:学透哈希表,数组使用有技巧!Leetcode:242.有效的字母异位词_哔哩哔哩_bilibili自己的思路:首先就是对字符串进行分开成一个一个单独的字母,然后使用列表存储这些数据,再对......
  • LeetCode刷题日记之贪心算法(五)
    目录前言无重叠区间划分字母区间合并区间单调递增的数字监控二叉树总结前言随着对贪心算法的不断深入,本篇文章将继续挑战一些经典的题目,进一步巩固这一算法的应用技巧。希望博主记录的内容能够帮助大家更好地掌握贪心算法的解题思路✍✍✍无重叠区间LeetCode题目......
  • Leetcode 160. Intersection of Two Linked Lists
    Leetcode160.IntersectionofTwoLinkedLists错解一开始没看清题目的要求中,提到最后表结构不能变,想到的做法是:先遍历A,把A翻转,然后B就可以走到headA判断出它们是否相交,但是即便如此,也不能判断出相交点在哪里,而且还会破坏链表的结构,所以这种写法不行。正解classSolution{......
  • Leetcode 1584. 连接所有点的最小费用
    1.题目基本信息1.1.题目描述给你一个points数组,表示2D平面上的一些点,其中points[i]=[x_i,y_i]。连接点[x_i,y_i]和点[x_j,y_j]的费用为它们之间的曼哈顿距离:|x_i–x_j|+|y_i–y_j|,其中|val|表示val的绝对值。请你返回将所有点连接的最小总费用。只......
  • [LeetCode] 910. Smallest Range II
    Youaregivenanintegerarraynumsandanintegerk.Foreachindexiwhere0<=i<nums.length,changenums[i]tobeeithernums[i]+kornums[i]-k.Thescoreofnumsisthedifferencebetweenthemaximumandminimumelementsinnums.Returnt......
  • 闯关leetcode——110. Balanced Binary Tree
    大纲题目地址内容解题代码地址题目地址https://leetcode.com/problems/balanced-binary-tree/description/内容Givenabinarytree,determineifitisheight-balanced.Aheight-balancedbinarytreeisabinarytreeinwhichthedepthofthetwosub......
  • 代码随想录算法训练营第五天| 面试题02.07.链表相交、leetcode142 环形链表II
    1.leetcode面试题02.07.链表相交题目链接:面试题02.07.链表相交-力扣(LeetCode)文章链接:代码随想录1.1代码跟着老师写的一个版本,自己能理解思路了,但是写的话可能还是有一些难#Definitionforsingly-linkedlist.#classListNode:#def__init__(self,x):#......