首页 > 其他分享 >383_赎金信

383_赎金信

时间:2024-10-15 14:45:13浏览次数:9  
标签:ransomNote map 遍历 字符 int magazine 383 赎金

383_赎金信

【问题描述】

给你两个字符串:ransomNotemagazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。如果可以,返回 true ;否则返回 falsemagazine 中的每个字符只能在 ransomNote 中使用一次。

示例一:
输入:ransomNote = "a", magazine = "b"
输出:false

示例二:
输入:ransomNote = "aa", magazine = "ab"
输出:false

示例三:
输入:ransomNote = "aa", magazine = "aab"
输出:true

提示:

  • 1 <= ransomNote.length, magazine.length <= 105
  • ransomNotemagazine 由小写英文字母组成

【算法设计思想】

字符频率统计:

使用一个固定大小的数据结构(如数组、哈希表等)来统计magazine中每个字符的出现频率。由于题目限定了只包含小写英文字母,所以可以使用一个长度为26的整型数组来存储每个字母的出现次数。

频率对比:

遍历ransomNote中的每个字符,检查这些字符在之前创建的频率统计表中是否有足够的数量。如果对于ransomNote中的任意一个字符,其在magazine中的出现次数少于所需,则不能构建该ransomNote,返回false。
如果所有字符都能满足条件,则可以构建ransomNote,返回true。

【算法描述】

C++:

class Solution {
public:
    // 检查能否使用 magazine 中的字符构造 ransomNote
    bool canConstruct(string ransomNote, string magazine) {
        // 如果 ransomNote 的长度大于 magazine,则无法构造
        if (ransomNote.size() > magazine.size()) {
            return false;
        }

        // 使用数组记录 magazine 中字符的出现次数(假设只包含小写字母)
        int map[26] = {0};

        // 遍历 magazine 中的每个字符,并记录每个字符的出现次数
        for (int i = 0; i < magazine.size(); i++) {
            map[magazine[i] - 'a']++;
        }

        // 遍历 ransomNote 中的每个字符,减少 map 中对应字符的计数
        for (int i = 0; i < ransomNote.size(); i++) {
            map[ransomNote[i] - 'a']--;
            // 如果计数小于 0,说明字符不够用,无法构造 ransomNote
            if (map[ransomNote[i] - 'a'] < 0) {
                return false;
            }
        }

        // 如果所有字符都能匹配,返回 true
        return true;
    }
};


Java:

class Solution {
    // 方法:检查是否可以使用 magazine 中的字符构造 ransomNote
    public boolean canConstruct(String ransomNote, String magazine) {
        // 定义一个数组来记录 magazine 中每个字符的出现次数(假设只有小写字母)
        int[] map = new int[26];

        // 遍历 magazine 中的每个字符,并记录每个字符的出现次数
        for (int i = 0; i < magazine.length(); i++) {
            map[magazine.charAt(i) - 'a']++;
        }

        // 遍历 ransomNote 中的每个字符,减少 map 中对应字符的计数
        for (int i = 0; i < ransomNote.length(); i++) {
            map[ransomNote.charAt(i) - 'a']--;
            // 如果计数小于 0,说明 magazine 中的字符不够用,无法构造 ransomNote
            if (map[ransomNote.charAt(i) - 'a'] < 0) {
                return false;
            }
        }

        // 如果所有字符都能匹配,则返回 true
        return true;
    }
}


Python:

class Solution:
    def canConstruct(self, ransomNote: str, magazine: str) -> bool:
        # 初始化一个长度为26的列表,用于存储magazine中每个字母的数量
        letter_count = [0] * 26
        
        # 遍历magazine中的每个字符,并增加对应位置的计数
        for char in magazine:
            letter_count[ord(char) - ord('a')] += 1
        
        # 遍历ransomNote中的每个字符,减少letter_count中对应位置的计数
        for char in ransomNote:
            letter_count[ord(char) - ord('a')] -= 1
            # 如果某个字符的数量小于0,说明magazine中该字符的数量不足以构成ransomNote
            if letter_count[ord(char) - ord('a')] < 0:
                return False
        
        # 如果所有字符的数量都足够,则返回True
        return True

C:

// 判断是否可以从magazine字符串中构建出ransomNote字符串
bool canConstruct(char* ransomNote, char* magazine) {
    // 创建一个大小为26的数组来记录每个小写字母在magazine中的出现次数
    int map[26] = {0};

    // 遍历magazine字符串,统计每个字符出现的次数
    for (int i = 0; i < strlen(magazine); i++) {
        // 将字符转换为数组索引('a'->0, 'b'->1, ..., 'z'->25)并递增对应的计数
        map[magazine[i] - 'a']++;
    }

    // 遍历ransomNote字符串,检查所需的字符数量是否不超过magazine中的可用数量
    for (int i = 0; i < strlen(ransomNote); i++) {
        // 对于ransomNote中的每个字符,减少其在map中的计数
        map[ransomNote[i] - 'a']--;

        // 如果某个字符的计数变为负数,说明magazine中的该字符不足以构建ransomNote
        if (map[ransomNote[i] - 'a'] < 0) {
            return false; // 返回false表示无法构建
        }
    }

    // 如果成功遍历完ransomNote且没有计数变为负数,说明可以构建
    return true;
}

标签:ransomNote,map,遍历,字符,int,magazine,383,赎金
From: https://www.cnblogs.com/zeta186012/p/18467467

相关文章