leetcode 1419 数青蛙
一、题目描述
二、解题思路
整体思路
整体上,我们可以采用模拟+哈希表的思想来解决数青蛙问题。
具体思路
(1)首先进行边界处理,如果croakOfFrogs字符串的长度不为"croak"长度的整数倍,则代表一定鸣叫不成功,直接返回-1;
(2)哈希表pre用于记录“croak”字符串每一个字符的前一个字符,便于查找,先将哈希表pre按要求初始化;
(3)哈希表Croak用于模拟青蛙鸣叫,遍历字符串croakOfFrogs,如果当前字符为'c',则代表有一只青蛙开始鸣叫,Croak['c']++;
(4)如果当前字符不为'c',则需要检查Croak[pre[x]]是否为0:
<1>如果为零,则代表鸣叫不合法,直接返回-1;
<2>如果不为零,则代表可以继续往后鸣叫,再将Croak[pre[x]]--,Croak[x]++;
(5)遍历完字符串croakOfFrogs后,如果Croak['c'],Croak['r'],Croak['o'],Croak['a']均为0则代表鸣叫均完成,返回Croak['k']即可。否则,则代表有鸣叫未完成,返回-1。
注意:由于要求最少的青蛙数,所有当当前字符为'c',即需要新的青蛙开始鸣叫时,先检查Croak['k']是否为0,即是否有青蛙已经鸣叫完:
<1>如果不为0,则拎一只旧青蛙开始鸣叫(Croak['k']--;Croak['c']++;);
<2>如果为0,表示当前无青蛙已经完成鸣叫,直接将Croak['c']++即可。
三、代码实现
时间复杂度:T(n)=O(n)
空间复杂度:S(n)=O(1)
class Solution {
public:int minNumberOfFrogs(string croakOfFrogs) {//模拟+哈希//边界处理if(croakOfFrogs.size()%5!=0) return -1;unordered_map<char,char> pre;//初始化哈希表pre,键为当前字符,值为前一个字符pre['r']='c';pre['o']='r';pre['a']='o';pre['k']='a';//哈希表Croak用于模拟青蛙鸣叫unordered_map<char,int> Croak;for(auto x:croakOfFrogs){if(x=='c') {if(Croak['k']>=1) Croak['k']--;Croak['c']++;}//如果前面的字符未出现if(x!='c'&&Croak[pre[x]]==0) return -1;if(x!='c'&&Croak[pre[x]]!=0){Croak[x]++;Croak[pre[x]]--;}}//判定模拟结果是否合法if(Croak['c']==0&&Croak['r']==0&&Croak['o']==0&&Croak['a']==0)return Croak['k'];return -1;}
};