力扣(leetcode)每日一题 1419 数青蛙 |对应华为od 一群大雁往南飞

1419. 数青蛙

题干

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

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

要想发出蛙鸣 “croak”,青蛙必须 依序 输出 ‘c’, ’r’, ’o’, ’a’, ’k’ 这 5 个字母。如果没有输出全部五个字母,那么它就不会发出声音。如果字符串 croakOfFrogs 不是由若干有效的 “croak” 字符混合而成,请返回 -1 。

示例 1:

**输入:**croakOfFrogs = “croakcroak”
**输出:**1
**解释:**一只青蛙 “呱呱” 两次

示例 2:

输入:croakOfFrogs = “crcoakroak”
输出:2
解释:最少需要两只青蛙,“呱呱” 声用黑体标注
第一只青蛙 "crc
oak
roak"
第二只青蛙 "cr
c
oak
roak
"

题解

crock 对应的数组int[5] 的空格中,分别是0,1,2,3,4 当c出现的时候,说明有一只青蛙在空格0中。当r出现的时候,需要青蛙从0跳到1 。 然后当k出现的时候,青蛙要结束本身的生命周期。因为之后再有声音c出现的时候,可以和结束生命周期的青蛙,认定为同一只

结算的话,出现c,就表示多一只青蛙出现,出现k,表示少一直青蛙出现

public int minNumberOfFrogs(String croakOfFrogs) {
        char[] arr = croakOfFrogs.toCharArray();
        HashMap<Character, Integer> map = new HashMap<>();
        map.put('c', 0);
        map.put('r', 1);
        map.put('o', 2);
        map.put('a', 3);
        map.put('k', 4);
        int[] dp = new int[5];
        int res = 0;
        int flogNum = 0;
        for (int i = 0; i < arr.length; i++) {
            char c = arr[i];
            Integer index = map.get(c);
            if (index != 4 && index != 0) {
                if (dp[index - 1] == 0) {
                    return -1;
                }
                dp[index - 1]--;
                dp[index]++;
            } else if (index == 0) {
                flogNum++;
                dp[0]++;
            } else if (index == 4) {
                // 需要结算
                dp[3]--;
                res = Math.max(res, flogNum);
                flogNum--;
            }
        }
        if (flogNum > 0) {
            return -1;
        }
        return res;
    }

总结

这样的题目最难分析了。

最新华为OD机试
题目描述

一群大雁往南飞,给定一个字符串记录地面上的游客听到的大雁叫声,请给出叫声最少由几只大雁发出。

具体的:
​ 1.大雁发出的完整叫声为”quack“,因为有多只大雁同一时间嘎嘎作响,所以字符串中可能会混合多个”quack”。

​ 2.大雁会依次完整发出”quack”,即字符串中’q’ ,‘u’, ‘a’, ‘c’, ‘k’ 这5个字母按顺序完整存在才能计数为一只大雁。如果不完整或者没有按顺序则不予计数。

​ 3.如果字符串不是由’q’, ‘u’, ‘a’, ‘c’, ‘k’ 字符组合而成,或者没有找到一只大雁,请返回-1。
求大雁的数量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值