【每日一题Day198】LC1419数青蛙 | 计数

简介: 【每日一题Day198】LC1419数青蛙 | 计数

数青蛙【LC1419】

给你一个字符串 croakOfFrogs,它表示不同青蛙发出的蛙鸣声(字符串 "croak" )的组合。由于同一时间可以有多只青蛙呱呱作响,所以 croakOfFrogs 中会混合多个 “croak”

请你返回模拟字符串中所有蛙鸣所需不同青蛙的最少数目。

要想发出蛙鸣 “croak”,青蛙必须 依序 输出 ‘c’, ’r’, ’o’, ’a’, ’k’ 这 5 个字母。

如果没有输出全部五个字母,那么它就不会发出声音。如果字符串 croakOfFrogs 不是由若干有效的 “croak” 字符混合而成,请返回 -1

思路

记录每个字符出现的个数、剩余c的个数

  • 如果字符串由若干有效的croak组成,那么字符c个数应大于等于字符r,字符r个数应大于等于字符o,字符o个数应大于等于字符a,字符a个数应大于等于字符k,如果不满足以上任意情况返回-1
  • 如果当前字符为k,那么表示有一个完整的croak,此时剩余c的个数减1,如果遍历结束仍有字符c剩余,返回-1
  • 那么青蛙的最少数目即为最大的剩余c的个数
  • 实现
class Solution {
    public int minNumberOfFrogs(String croakOfFrogs) {
        int n = croakOfFrogs.length();
        Map<Character, Integer> counts = new HashMap<>();
        int cur = 0;
        int res = 0;
        for (int i = 0; i < n; i++){
            char c = croakOfFrogs.charAt(i);
            counts.put(c, counts.getOrDefault(c, 0) + 1);
            if (c == 'c'){
                cur++;
                res = Math.max(res, cur);
            }else if (c == 'k'){
                cur--;
            }
            if(counts.getOrDefault('r', 0) > counts.getOrDefault('c', 0) || counts.getOrDefault('o', 0) > counts.getOrDefault('r', 0)
                ||counts.getOrDefault('a', 0) > counts.getOrDefault('o', 0) || counts.getOrDefault('k', 0) > counts.getOrDefault('a', 0)){
                    return -1;
                }
        }
        if (cur != 0) return -1;
        return res;
    }
} 

image.png


目录
相关文章
|
6月前
【每日一题Day356】LC2678老人的数目 | 字符串
【每日一题Day356】LC2678老人的数目 | 字符串
49 0
|
6月前
|
算法
【每日一题Day363】LC275H 指数Ⅱ | 二分答案
【每日一题Day363】LC275H 指数Ⅱ | 二分答案
55 0
|
6月前
|
存储 人工智能 算法
【每日一题Day348】LC137只出现一次的数字Ⅱ | 状态转移
【每日一题Day348】LC137只出现一次的数字Ⅱ | 状态转移
48 0
|
6月前
【每日一题Day141】LC2379得到 K 个黑块的最少涂色次数 | 滑动窗口
【每日一题Day141】LC2379得到 K 个黑块的最少涂色次数 | 滑动窗口
40 0
|
6月前
【每日一题Day221】LC2455可被三整除的偶数的平均值 | 模拟
【每日一题Day221】LC2455可被三整除的偶数的平均值 | 模拟
49 0
|
6月前
|
机器学习/深度学习
【每日一题Day263】LC2544交替数字和 | 数学
【每日一题Day263】LC2544交替数字和 | 数学
49 0
|
6月前
【每日一题Day206】LC1054距离相等的条形码 | 计数+大顶堆 计数+排序
【每日一题Day206】LC1054距离相等的条形码 | 计数+大顶堆 计数+排序
44 0
|
6月前
【每日一题Day312】LC2240买钢笔和铅笔的方案数 | 完全背包 数学
【每日一题Day312】LC2240买钢笔和铅笔的方案数 | 完全背包 数学
60 0
|
6月前
【每日一题Day371】LC2586统计范围内的元音字符串数 | 模拟
【每日一题Day371】LC2586统计范围内的元音字符串数 | 模拟
55 1
|
6月前
【每日一题Day362】LC274H 指数 | 二分答案
【每日一题Day362】LC274H 指数 | 二分答案
38 0