Leetcode 1419:数青蛙(超详细的解法!!!)
给你一个字符串 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'
解题思路
实际上这个问题类似于一个压栈操作,对于五个字符'croak'
分别建立栈,然后遍历字符串,对于遍历到的字符,分别压入对应字符栈中。只要栈中的元素个数满足c >= r >= o >= a >= k
就是有效的,每个字符栈长度的最大值就是青蛙的个数。当每个字符栈的元素个数都大于0
的时候(此时满足一个青蛙叫),我们就可以将每个元素出栈一次,表示一个青蛙。
class Solution:def minNumberOfFrogs(self, cr: str) -> int:res = 0s = {'c':0, 'r':1, 'o':2, 'a':3, 'k':4}st = [0] * 5for i in cr:if st[0] >= st[1] >= st[2] >= st[3] >= st[4]:st[s[i]] += 1res = max(res, st[s[i]])if all(v > 0 for v in st):for c in 'croak':st[s[c]] -= 1else:return -1if st[0] == st[1] == st[2] == st[3] == st[4]:return resreturn -1
实际上当出现'c'
的时候就表示出现了一个青蛙,当出现'k'
的时候就减少了一个青蛙,那么代码可以这么去写:
class Solution:def minNumberOfFrogs(self, cr: str) -> int:res, frogs = 0, 0st = [0] * 5for i in cr:if i == 'c':st[0] += 1frogs += 1elif i == 'r':st[1] += 1elif i == 'o':st[2] += 1elif i == 'a':st[3] += 1else:st[4] += 1frogs -= 1res = max(res, frogs)if not (st[0] >= st[1] >= st[2] >= st[3] >= st[4]): return -1if st[0] == st[1] == st[2] == st[3] == st[4]:return resreturn -1
reference:
https://leetcode.com/problems/minimum-number-of-frogs-croaking/discuss/586543/C%2B%2BJava-with-picture-simulation
我将该问题的其他语言版本添加到了我的GitHub Leetcode
如有问题,希望大家指出!!!
Leetcode 1419:数青蛙(超详细的解法!!!)相关推荐
- LeetCode - 1419 数青蛙
题目来源 1419. 数青蛙 - 力扣(LeetCode) 题目描述 给你一个字符串 croakOfFrogs,它表示不同青蛙发出的蛙鸣声(字符串 "croak" )的组合.由于同 ...
- Leetcode 1134:阿姆斯特朗数(超详细的解法!!!)
假设存在一个 k 位数 N,其每一位上的数字的 k 次幂的总和也是 N,那么这个数是阿姆斯特朗数. 给你一个正整数 N,让你来判定他是否是阿姆斯特朗数,是则返回 true,不是则返回 false. 示 ...
- LeetCode 1419. 数青蛙(脑洞题)
1. 题目 给你一个字符串 croakOfFrogs,它表示不同青蛙发出的蛙鸣声(字符串 "croak" )的组合. 由于同一时间可以有多只青蛙呱呱作响,所以 croakOfFro ...
- leetcode 1419 数青蛙
描述: 给你一个字符串 croakOfFrogs,它表示不同青蛙发出的蛙鸣声(字符串 "croak" )的组合.由于同一时间可以有多只青蛙呱呱作响,所以 croakOfFrogs ...
- Leetcode 29:两数相除(超详细的解法!!!)
给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例 1: 输 ...
- Leetcode 37:解数独(超详细的解法!!!)
编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实线分隔的 3x3 ...
- Leetcode 503:下一个更大元素 II(超详细的解法!!!)
给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它 ...
- Leetcode 1162:地图分析(超详细的解法!!!)
你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了.其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远的海洋区域是是哪一个吗 ...
- Leetcode 1229:安排会议日程(超详细的解法!!!)
你是一名行政助理,手里有两位客户的空闲时间表:slots1 和 slots2,以及会议的预计持续时间 duration,请你为他们安排合适的会议时间. 「会议时间」是两位客户都有空参加,并且持续时间能 ...
- Leetcode 496:下一个更大元素 I(超详细的解法!!!)
给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字 x 的下一个更 ...
最新文章
- OpenCV中 Mat 按行或按列合并程序
- Ctrl+C提示是否终止shell脚本
- java导入lucene_如何导入lucene的.jar包 ?
- 使用 Portainer UI 管理 Docker 主机
- 2021-04-24 Python 最小二乘法求解线性回归模型
- Linux服务器日常巡检脚本分享
- python爬虫天气预报_Python爬虫实例扒取2345天气预报
- 常犯的18个统计学错误, 避坑防雷指南!
- AE点击按钮添加栅格
- Apache RocketMQ 深圳沙龙报名开启!
- 最常见并发面试题整理!(速度收藏)
- Java数据库篇3——SQL
- 通过结构体某个成员的地址计算结构体首地址
- Bash(Shell)基础知识
- c java http通讯,c语言经过http请求javaee项目
- 计算机机房综合布线方案,计算机网络设备施工方案(不含综合布线)(word版)
- nx.adjacency_matrix(G).todense()计算邻接矩阵与真实结果不一致
- android自定义矩形框,Android 中自定义长方形
- 【热门】牛宝宝取名大全:女孩带点诗意唯美柔情的名字
- linux jq 数组,linux shell脚本 用jq命令在JSON文件肿添加一个map或数组