目录链接:
力扣编程题-解法汇总_分享+记录-CSDN博客
GitHub同步刷题项目:
https://github.com/September26/java-algorithms
原题链接:力扣
描述:
给你一个字符串 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'
解题思路:
* 解题思路: * 构建数组arrays,arrays[0]代表c的数量,arrays[1]代表cr的数量。 * 从前向后遍历,读到c,则arrays[0]++,如果读到r,则arrays[0]--,arrays[1]++。如果此时arrays[0]则0,则直接返回-1。 * 其他情况类似。 * 每次arrays[0]++时,count+1,因为这代表一个新的青蛙在叫。 * 每次arrays[3]--时,count-1,因为这代表一个青蛙叫完了。求count最大值即可。
代码:
public class Solution1419 {
// crocracokrakoak
public int minNumberOfFrogs(String croakOfFrogs) {
int[] arrays = new int[4];
char[] chars = croakOfFrogs.toCharArray();
int maxCount = 0;
int count = 0;
for (int i = 0; i < chars.length; i++) {
char aChar = chars[i];
if (aChar == 'c') {
arrays[0]++;
count++;
continue;
}
if (aChar == 'r') {
if (arrays[0] > 0) {
arrays[0]--;
arrays[1]++;
continue;
}
return -1;
}
if (aChar == 'o') {
if (arrays[1] > 0) {
arrays[1]--;
arrays[2]++;
continue;
}
return -1;
}
if (aChar == 'a') {
if (arrays[2] > 0) {
arrays[2]--;
arrays[3]++;
continue;
}
return -1;
}
if (aChar == 'k') {
if (arrays[3] > 0) {
arrays[3]--;
maxCount = Math.max(maxCount, count);
count--;
continue;
}
}
return -1;
}
if (count > 0) {
return -1;
}
return maxCount;
}
}