算法日常・每日刷题--<模拟>5

1419. 数青蛙 - 力扣(LeetCode)1419. 数青蛙 - 给你一个字符串 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'https://leetcode.cn/problems/minimum-number-of-frogs-croaking/description/

题目理解

这道题是 LeetCode 第 1419 题,难度中等。题目描述了一个有趣的场景:

不同青蛙发出 "croak" 的声音,同一时间可能有多只青蛙在叫,所以字符串中混合了多个 "croak"。我们需要求出模拟字符串中所有蛙鸣所需不同青蛙的最少数目

  1. 青蛙必须依次 发出 c → r → o → a → k 这 5 个字母

  2. 如果字母顺序不对,或者缺少某些字母,返回 -1

  3. 同一时刻多只青蛙可以同时叫(不同青蛙处在发声的不同阶段)

关键观察

一只青蛙发出完整 "croak" 的过程可以理解为:

  • 开始叫:发出 'c'

  • 进行中:发出 'r''o''a'

  • 结束叫:发出 'k'

最少青蛙数 = 同一时刻正在发声的青蛙的最大数量(峰值并发数)。

解法

我们需要追踪每个阶段有多少只青蛙:

  • c:发出 c 的青蛙数量(等待发 r

  • r:发出 r 的青蛙数量(等待发 o

  • o:发出 o 的青蛙数量(等待发 a

  • a:发出 a 的青蛙数量(等待发 k

  • k:发出 k 的青蛙数量(已结束,可复用)

在实际中,我们只要看该字符,的前面一个字符是否出现,如果出现就将前面字符--,该字符相加,如果没有出现就说明这不可能是合理的蛙叫,直接return -1即可

c字符找k有无,有则k--,c++,无则c++即可

我们也要保证里面的结束之后k之前的字符都不能出现

为什么这样可以找到最小青蛙数?

  • k 表示已经完成完整叫声的青蛙,它们可以立即复用

  • 只有在没有空闲青蛙时,才需要引入新青蛙

  • 这样贪心地复用已经完成的青蛙,得到的青蛙总数就是最少的

cpp 复制代码
#include<string.h>
#include<vector>
#include<unordered_map>
class Solution {
public:
    int minNumberOfFrogs(string croakOfFrogs) {
        int n=croakOfFrogs.size();
        
        unordered_map<char,int> hash;
        hash['c']=0;
        hash['r']=0;
        hash['o']=0;
        hash['a']=0;
        hash['k']=0;
        
        for(int i=0;i<n;i++)
        {
            if(croakOfFrogs[i]=='c')
            {
                 if(hash['k'])
                 {
                hash['k']--;
                 }
                hash['c']++;

            }
            
            if(croakOfFrogs[i]=='r')
            {
                if(hash['c'])
                 {
                hash['c']--;
                hash['r']++;
                 }
                 else
                 return -1;
            }
            
       
            if(croakOfFrogs[i]=='o')
            {
                if(hash['r'])
                 {
                hash['r']--;
                hash['o']++;
                 }
                 else
                 return -1;
            }
            if(croakOfFrogs[i]=='a')
            {
                if(hash['o'])
                 {
                hash['o']--;
                hash['a']++;
                 }
                 else
                 return -1;
            }
            if(croakOfFrogs[i]=='k')
            {
                if(hash['a'])
                 {
                hash['a']--;
                hash['k']++;
                 }
                 else
                 return -1;
            }

        }
        if(hash['c']||hash['r']||hash['o']||hash['a'])
        return -1;
        return hash['k'];
    }
};