力扣第383题——赎金信(C语言题解)

小白偶尔在互联网上随地乱丢一些赛博垃圾 ,还望拨冗批评斧正。

目录

题目描述

思路分析

代码实现(C语言)

官方题解(C++)


题目描述

给你两个字符串: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 <= 105
  • ransomNote 和 magazine 由小写英文字母组成

思路分析

既然可以使用 magazine[i] 来访问字符串数组,那我就先从 ransomNote 中从头开始找字母,找到手里拿着一个字母,我就到 magazine 字符串中取出一个数组(将该位置置为“0”),然后再在 ransomNote 中按顺序操作下一个字母。如果在某一次操作中发现在 magazine 中无法找到和手中相同的字母,那么判定为失败。当把 ransomNote 中的所有字母全部遍历一遍之后,判定为成功。

代码实现(C语言)

bool canConstruct(char * ransomNote, char * magazine){
    int magazine_length = strlen(magazine);
	int ransomNote_length = strlen(ransomNote);
    if(magazine_length < ransomNote_length)
    {
        return false;
    }
	int maga[magazine_length];
	for(int i = 0;i < ransomNote_length;i++)
	{
		int judge = 1;
		for(int j = 0;j < magazine_length;j++)
		{
			if(ransomNote[i] == magazine[j])
			{
				judge = 0;
				magazine[j] = '0';
				break;
			}
		}
		if(judge)
		{
			return false;
		}
	}
	return true;
}

复杂度分析:

时间复杂度:O(m*n)  其中 m 是  ransomNote 的长度, n 是 magazine 的长度。

空间复杂度:O(m + n) 其中 m 是  ransomNote 的长度, n 是 magazine 的长度。


 

官方题解(C++)

class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        if (ransomNote.size() > magazine.size()) {
            return false;
        }
        vector<int> cnt(26);
        for (auto & c : magazine) {
            cnt[c - 'a']++;
        }
        for (auto & c : ransomNote) {
            cnt[c - 'a']--;
            if (cnt[c - 'a'] < 0) {
                return false;
            }
        }
        return true;
    }
};

复杂度分析

时间复杂度:O(m+n),其中 m 是  ransomNote 的长度, n 是 magazine 的长度。我们只需要遍历两个字符一次即可。

空间复杂度:O(∣S∣),S 是字符集,这道题中 S 为全部小写英语字母,因此 ∣S∣=26

但是因为我也不会 C++,所以只能照搬惹。。。

力扣刷题网址:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

小白不定期在互联网上随地乱丢一些赛博垃圾,还望拨冗批评斧正~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值