题目理解
这道题是 LeetCode 第 1419 题,难度中等。题目描述了一个有趣的场景:
不同青蛙发出
"croak"的声音,同一时间可能有多只青蛙在叫,所以字符串中混合了多个"croak"。我们需要求出模拟字符串中所有蛙鸣所需不同青蛙的最少数目。
-
青蛙必须依次 发出
c → r → o → a → k这 5 个字母 -
如果字母顺序不对,或者缺少某些字母,返回
-1 -
同一时刻多只青蛙可以同时叫(不同青蛙处在发声的不同阶段)
关键观察
一只青蛙发出完整 "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'];
}
};