leetcode:383.赎金信

题目

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ransom-note

为了不在赎金信中暴露字迹,从杂志上搜索各个需要的字母,组成单词来表达意思。

给你一个赎金信 (ransomNote) 字符串和一个杂志(magazine)字符串,判断 ransomNote 能不能由 magazines 里面的字符构成。

如果可以构成,返回 true ;否则返回 false 。

magazine 中的每个字符只能在 ransomNote 中使用一次。

示例 1:

输入:ransomNote = “a”, magazine = “b”
输出:false

示例 2:

输入:ransomNote = “aa”, magazine = “ab”
输出:false

示例 3:

输入:ransomNote = “aa”, magazine = “aab”
输出:true

扫描二维码关注公众号,回复: 13595320 查看本文章

提示:

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

解法

  • 该题目是一个字符比对问题,可以使用哈希表来存储参考字符是否出现以及出现的次数。再遍历对比字符串的时候与哈希字典中的元素进行比较:

  • 出现在字典中:

    • 出现次数大于1, 则减1继续遍历
    • 次数为0, 则直接返回False
  • 不出现在字典中,直接返回False

  • python

  class Solution:
    def canConstruct(self, ransomNote: str, magazine: str) -> bool:
        d = {
    
    }
        for s in magazine:
            if s not in d:
                d[s] = 1
            else:
                d[s] += 1
        
        for s in ransomNote:
            if s not in d:
                return False
            else:
                if d[s] == 0:
                    return False
                d[s] -= 1
        return True
  • c++
class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        map<char, int>  dict;
        int n = magazine.length();
        for(int i=0; i<n; i++)
        {
            if(dict.count(magazine[i]))
            {
                dict[magazine[i]] += 1;
            } 
            else
            {
                dict[magazine[i]] = 1;
            }
        }

        int m = ransomNote.length();
        for(int j=0; j<m; j++)
        {
            if(dict.count(ransomNote[j]))
            {
                if(dict[ransomNote[j]] == 0)
                {
                    return false;
                }
                dict[ransomNote[j]] -= 1;
                
            }
            else
            {
                return false;
            }
        }
        return true;

    }
};

复杂度分析

  • 时间复杂度:
    • O ( N + M ) O(N+M) O(N+M) 遍历两个字符串所需要花费的时间
  • 空间复杂度:
    • O ( S ) O(S) O(S) 哈希字典需要的空间,S最多是26个字母

参考

猜你喜欢

转载自blog.csdn.net/uncle_ll/article/details/121724151
今日推荐