力扣1419题
题目描述:数青蛙
给你一个字符串 croakOfFrogs,它表示不同青蛙发出的蛙鸣声(字符串 “croak” )的组合。由于同一时间可以有多只青蛙呱呱作响,所以 croakOfFrogs 中会混合多个 “croak” 。
请你返回模拟字符串中所有蛙鸣所需不同青蛙的最少数目。
要想发出蛙鸣 “croak”,青蛙必须 依序 输出 ‘c’, ’r’, ’o’, ’a’, ’k’ 这 5 个字母。如果没有输出全部五个字母,那么它就不会发出声音。如果字符串 croakOfFrogs 不是由若干有效的 “croak” 字符混合而成,请返回 -1 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minimum-number-of-frogs-croaking
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解思路:
参考一个答主写的思路,设计的很巧妙,通过建一个一维数组num[],长度为5,用来存放五个字符的状态,k表示叫完了,对于其他4个字母:
- 0:叫了
- 1:没叫
返回-1的情况:
① 第一个字母不是 c
② 遍历到当前位置,发现croak的顺序不连,即num[i-1]=0
③ 遍历结束之后,前四个字母不相等
代码如下:
class Solution {
public int minNumberOfFrogs(String croakOfFrogs) {
//1.遍历字符串
//2.新建一个数组,存放青蛙的个数
int[] num = new int[5];
for (int i=0; i<croakOfFrogs.length();i++){
//第一个字母必须是 'c'
if (croakOfFrogs.charAt(0) != 'c'){
return -1;
}
if (croakOfFrogs.charAt(i) == 'c'){
if (num[4] != 0){//不处理
--num[4];
}
++num[0];
}else if (croakOfFrogs.charAt(i) == 'r'){
if (num[0] == 0){
return -1;
}
++num[1];
--num[0];
}else if (croakOfFrogs.charAt(i) == 'o'){
if (num[1] == 0){
return -1;
}
++num[2];
--num[1];
}else if (croakOfFrogs.charAt(i) == 'a'){
if (num[2] == 0){
return -1;
}
++num[3];
--num[2];
}else if (croakOfFrogs.charAt(i) == 'k'){
if (num[3] == 0){
return -1;
}
++num[4];
--num[3];
}
}
//判断返回
return (num[0] == 0 && num[1] == 0 && num[2] == 0 && num[3] == 0) ? num[4] : -1;
}
}