【1419. 数青蛙】

来源:力扣(LeetCode)

描述:

给你一个字符串 croakOfFrogs,它表示不同青蛙发出的蛙鸣声(字符串 "croak" )的组合。由于同一时间可以有多只青蛙呱呱作响,所以 croakOfFrogs 中会混合多个 “croak”

请你返回模拟字符串中所有蛙鸣所需不同青蛙的最少数目。

要想发出蛙鸣 "croak",青蛙必须 依序 输出 ‘c’, ’r’, ’o’, ’a’, ’k’5 个字母。如果没有输出全部五个字母,那么它就不会发出声音。如果字符串 croakOfFrogs 不是由若干有效的 "croak" 字符混合而成,请返回 -1

示例 1:

输入:croakOfFrogs = "croakcroak"
输出:1 
解释:一只青蛙 “呱呱” 两次

示例 2:

输入:croakOfFrogs = "crcoakroak"
输出:2 
解释:最少需要两只青蛙,“呱呱” 声用黑体标注
第一只青蛙 "crcoakroak"
第二只青蛙 "crcoakroak"

示例 3:

输入:croakOfFrogs = "croakcrook"
输出:-1
解释:给出的字符串不是 "croak" 的有效组合。

提示:

  • 1 <= croakOfFrogs.length <= 105
  • 字符串中的字符只有 ‘c’, ‘r’, ‘o’, ‘a’ 或者 ‘k’

方法:计数

思路与算法

题目给出一个字符串 croakOfFrogs,它表示不同青蛙发出的蛙鸣声的组合,且字符串中只包含 ‘c’,‘r’,‘o’,‘a’ 和 ‘k’ 五种字符。若一只青蛙想要发出蛙鸣,则该青蛙需要依序输出 ‘c’,‘r’,‘o’,‘a’ 和 ‘k’ 这 5 个字符。如果没有输出全部五个字符,那么它就不会发出声音。现在我们需要求得能模拟出字符串 croakOfFrogs 中所有蛙鸣所需青蛙的最少数目,其中同一时间可以有多只青蛙发出声音。若字符串 croakOfFrogs 不能被若干有效的蛙鸣混合而成,则返回 −1。

现在我们用 frog_num 来表示现在正在发出蛙鸣声的青蛙数目,用 cnt[c] 表示已经发出一次有效蛙鸣中的字符 c 的青蛙个数,比如当 cnt[‘c’] = 2 时表示当前有 2 只青蛙已经发出了有效蛙鸣中的字符 ‘c’,下一个需要发出字符 ‘r’。那么我们遍历字符串 croakOfFrogs 来模拟青蛙蛙鸣,现在记遍历到的字符为 c,有:

  • 若 c = ‘c’,则需要一只青蛙开始发出蛙鸣,有 fog_num = fog_num + 1,cnt[‘c’] = cnt[‘c’] + 1。
  • 否则我们记 prec 为一次有效蛙鸣中该字符 c 的前一个字符:
    • 若当前 cnt[prec] = 0,即没有青蛙可以发出字符 c,直接返回 −1。
    • 否则 cnt[prec] = cnt[prec] − 1,cnt[c] = cnt[c] + 1。且当 c = ‘k’ 时,说明一只青蛙完成了完整的一次蛙鸣,此时正在发出蛙鸣声的青蛙数目减一,有:fog_num = fog_num−1。

若遍历完还有正在发出蛙鸣的青蛙,即 fog_num > 0,说明 croakOfFrogs 不是被若干有效的蛙鸣混合而成,直接返回 −1。否则我们只需要返回在遍历的过程中正在发出蛙鸣的青蛙数目的最大值即可。

代码:

class Solution {
public:
    int minNumberOfFrogs(string croakOfFrogs) {
        if (croakOfFrogs.size() % 5 != 0) {
            return -1;
        }
        int res = 0, frogNum = 0;
        vector<int> cnt(4);
        unordered_map<char, int> mp = {{'c', 0}, {'r', 1}, {'o', 2}, {'a', 3}, {'k', 4}};
        for (char c : croakOfFrogs) {
            int t = mp[c];
            if (t == 0) {
                cnt[t]++;
                frogNum++;
                if (frogNum > res) {
                    res = frogNum;
                }
            } else {
                if (cnt[t - 1] == 0) {
                    return -1;
                }
                cnt[t - 1]--;
                if (t == 4) {
                    frogNum--;
                } else {
                    cnt[t]++;
                }
            }
        }
        if (frogNum > 0) {
            return -1;
        }
        return res;
    }
};

执行用时:24 ms, 在所有 C++ 提交中击败了38.64%的用户
内存消耗:8.9 MB, 在所有 C++ 提交中击败了62.66%的用户
复杂度分析
时间复杂度:O(n),其中 n 为字符串 croakOfFrogs 的长度。
空间复杂度:O(1),仅使用常量空间。
author:LeetCode-Solution

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千北@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值