题目描述:
给你一个字符串 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” 的有效组合。
示例 4:
输入:croakOfFrogs = “croakcroa”
输出:-1
提示:
1 <= croakOfFrogs.length <= 10^5
字符串中的字符只有 ‘c’, ‘r’, ‘o’, ‘a’ 或者 ‘k’
方法1:
主要思路:解题汇总链接
(1)遍历字符串每个字符时,统计每个字符的数量;
(2)若当前字符是第一个字符 ‘c’,则需要更新一次可能的最多的青蛙数量;
(3)否则,需要保证当前字符的数量比前一个字符的数量少或相等,如不能保证,则直接返回-1;
(4)否则,判断当前字符是否是最后一个字符,若是,则说明已经是连续的一声青蛙叫,故可以减去该青蛙的叫声的各个字符的统计;
(5)最后保证没有单独的蛙声的字符存在,否则直接返回-1;
class Solution {
public:
int minNumberOfFrogs(string croakOfFrogs) {
vector<int> counts(5,0);
int res=0;
for(char&ch:croakOfFrogs){
int index;
switch(ch){//判断字符对应的索引
case 'c': index=0;break;
case 'r': index=1;break;
case 'o': index=2;break;
case 'a': index=3;break;
case 'k': index=4;break;
}
//统计该字符的数量
++counts[index];
if(index==0){//若是第一声青蛙叫,则更新可能的最多的青蛙数量
res=max(res,counts[index]);
}
else if(counts[index]>counts[index-1]){//保证前一个蛙声的字符不少于当前字符的数量
return -1;
}
else if(index==4){//完整的蛙声,则更新字符
for(int i=0;i<5;++i){
--counts[i];
}
}
}
if(counts[0]!=0){//没有多余的蛙声的字符
return -1;
}
return res;
}
};