赎金信问题笔记【LeetCode】

本人是高一年级奥赛生,正在刷题找手感,如若代码抽搐无法运行,请相信是我的原因,而不是你环境或者其他问题……感谢理解

题目

给你两个字符串: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 <= 10^5
两个字符串均为小写字母

题目分析

首先这是一道LeetCode上的算法题,只需要提交相关的代码即可。

因为1 <= ransomNote.length, magazine.length <= 10^5,所以数据量不会很大,因此是入门级别。两个字符串均为小写字母,所以字符串由26个字符重复组成。我们可以定义一个数组,用于存储每个字符在magazine中出现的次数。并且减去在ransomNote中出现的次数。

定义一个数组:

int cnt[26]={0};

遍历字符串,记录字符的出现次数:

for (char & c : magazine) {
          
            cnt[c-'a']++;
        }

如果字符在ransonNote中出现的次数大于在magazine中农出现的次数,则不符合题意,返回FALSE:

for (char & c : ransomNote) {
    
            cnt[c-'a']--;
            if (cnt[c-'a'] < 0) {
                return false;
            }
        }

值得注意的是,如果ransomNote的字符数大于magazine的字符数,那么肯定无法达到题目的要求因此要判断这种情况是否存在,如果存在直接返回FALSE。

if (ransomNote.size() > magazine.size()) {
            return false;
        }

完整代码

题解:

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

在这里插入图片描述

完整程序:

#include<bits/stdc++.h>
class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        if (ransomNote.size() > magazine.size()) {
            return false;
        }
       int cnt[26]={0};
       
        for (char & c : magazine) {
          
            cnt[c-'a']++;
        }
        for (char & c : ransomNote) {
    
            cnt[c-'a']--;
            if (cnt[c-'a'] < 0) {
                return false;
            }
        }
        return true;
    }
};

string stringToString(string input) {
    assert(input.length() >= 2);
    string result;
    for (int i = 1; i < input.length() -1; i++) {
        char currentChar = input[i];
        if (input[i] == '\\') {
            char nextChar = input[i+1];
            switch (nextChar) {
                case '\"': result.push_back('\"'); break;
                case '/' : result.push_back('/'); break;
                case '\\': result.push_back('\\'); break;
                case 'b' : result.push_back('\b'); break;
                case 'f' : result.push_back('\f'); break;
                case 'r' : result.push_back('\r'); break;
                case 'n' : result.push_back('\n'); break;
                case 't' : result.push_back('\t'); break;
                default: break;
            }
            i++;
        } else {
          result.push_back(currentChar);
        }
    }
    return result;
}

string boolToString(bool input) {
    return input ? "True" : "False";
}

int main() {
    string line;
    while (getline(cin, line)) {
        string ransomNote = stringToString(line);
        getline(cin, line);
        string magazine = stringToString(line);
        
        bool ret = Solution().canConstruct(ransomNote, magazine);

        string out = boolToString(ret);
        cout << out << endl;
    }
    return 0;
}

PS:衡中校园网真慢……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值