模拟算法【3】——1419.数青蛙

在这里插入图片描述

文章目录

    • 🍥1. 题目
    • 🥮2. 算法原理
    • 🍡3. 代码实现

🍥1. 题目

题目链接:1419. 数青蛙 - 力扣(LeetCode)

给你一个字符串 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'

🥮2. 算法原理

这题是一个比较复杂的模拟,当我们遍历到当前的字符的时候,我们需要看前面是否有“青蛙”叫的字符,就是统计每个字符出现的情况,例如示例二:crcoakroak,当叫到第一个字符c的时候,我们用1标记一下,表示青蛙叫了一下,接下来遍历到r的时候,发现r前面有一个c字符,将前面的青蛙“挪过来”,让它叫r这个字符,即hash[c]--hash[r]++

image-20231130225814100
总结:

  • r o a k的逻辑都是一样的,都需要找一下前驱字符是否在哈希表中存在
    1. 存在前驱-1
    2. 不存在直接返回-1
  • c,找最后一个字符是否在哈希表当中
    1. 存在最后一个字符--,当前字符++
    2. 不存在说明没有青蛙叫,当前字符++

🍡3. 代码实现

class Solution {
public:
    int minNumberOfFrogs(string croakOfFrogs)
    {
        string cry = "croak";
        int n = cry.size();
        vector<int> hash(n);    //模拟哈希表
        
        unordered_map<char,int> index;  //存下标[ch,ch下标]
        for(int i=0; i<n; i++)
            index[cry[i]] = i;

        for(auto ch : croakOfFrogs)
        {
            if(ch == 'c')
            {
                if(hash[n-1] != 0)  hash[n-1]--;
                hash[0]++;
            }
            else
            {
                int i = index[ch];
                if(hash[i-1] == 0)  return -1;
                hash[i-1]--;
                hash[i]++;
            }
        }
        for(int i=0; i<n-1; i++)
            if(hash[i]!=0)
                return -1;
            
        return hash[n-1];
        
    }
};

运行结果:
在这里插入图片描述


模拟算法相关题目文章链接:
简单:1576. 替换所有的问号、495.提莫攻击
中等:6. N 字形变换、38. 外观数列

模拟算法主要就是锻炼将思路转换为代码的能力,没有太多套路,遇到了就按照思路一步一步写出来即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/206497.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

EG20网口远程下载程序使用案例

EG20网口远程下载程序使用案例 前言&#xff1a;本文档主要说明了使用蓝蜂虚拟网络工具通过EG20网关的网口&#xff08;LAN口&#xff09;远程给PLC下载程序的步骤及其注意事项。使用蓝蜂虚拟网络工具&#xff0c;不仅支持程序的远程下载&#xff0c;同样支持程序的远程上传与…

Windows 基于 VMware 虚拟机安装银河麒麟高级服务器操作系统

前言 抱着学习的态度研究一下麒麟系统的安装 银河麒麟&#xff08;KylinOS&#xff09;原是在“863计划”和国家核高基科技重大专项支持下&#xff0c;国防科技大学研发的操作系统&#xff0c;后由国防科技大学将品牌授权给天津麒麟&#xff0c;后者在2019年与中标软件合并为…

代码随想录刷题题Day2

刷题的第二天&#xff0c;希望自己能够不断坚持下去&#xff0c;迎来蜕变。&#x1f600;&#x1f600;&#x1f600; 刷题语言&#xff1a;C / Python Day2 任务 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵 II 1 有序数组的平方&#xff08;重点&#xff1a;双指针…

snat与dnat

一.SNAT的原理介绍 1.应用环境 局域网主机共享单个公网IP地址接入Internet &#xff08;私有IP不能在Internet中正常路由&#xff09; 2.SNAT原理 源地址转换&#xff0c;根据指定条件修改数据包的源IP地址&#xff0c;通常被叫做源映谢 数据包从内网发送到公网时&#xf…

嵌入式数据传输及存储的C语言实现

各种类型的数据传输和存储就涉及到大小端的问题&#xff0c;首先要简单说下芯片的大小端问题&#xff0c;这里主要讨论Cortex-M内核。 M内核支持大端或者小端&#xff0c;实际应用中大部分内核都是小端。以STM32为例&#xff0c;全部都是小端&#xff0c;而且是芯片设计之初就固…

飞致云开源社区月度动态报告(2023年11月)

自2023年6月起&#xff0c;中国领先的开源软件公司FIT2CLOUD飞致云以月度为单位发布《飞致云开源社区月度动态报告》&#xff0c;旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况&#xff0c;以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源大屏…

Linux安全配置

进入ssh配置文件 vim /etc/ssh/sshd_config将port 22中的端口号改为5001 重启ssh服务 systemctl restart sshd拓展 sh与bash iptable与firewall ssh与sshd vps与ssh 参考&#xff1a; 【安全-SSH】SSH安全设置 - CSDN AppLinux VPS服务器SSH端口一键修改脚本​Linux脚本…

TA-Lib学习研究笔记——Price Transform (五)

TA-Lib学习研究笔记——Price Transform &#xff08;五&#xff09; 1.AVGPRICE Average Price 函数名&#xff1a;AVGPRICE 名称&#xff1a;平均价格函数 语法&#xff1a; real AVGPRICE(open, high, low, close) df[AVGPRICE] tlb.AVGPRICE(df[open],df[high],df[low…

量子力学:探索微观世界的奇妙之旅

量子力学&#xff1a;探索微观世界的奇妙之旅 引言 在21世纪初&#xff0c;我们逐渐进入了一个以信息技术为主导的新时代。在这个时代&#xff0c;量子力学作为一门研究物质世界微观结构、粒子间相互作用以及能量与信息转换的基础科学&#xff0c;对我们的生活产生了深远的影响…

【机器学习】线性模型之逻辑回归

文章目录 逻辑回归Sigmoid 函数概率输出结果预测值与真实标签之间的并不匹配交叉熵逻辑回归模型 梯度下降逻辑回归模型求解编程求解sklearn 实现&#xff0c;并查看拟合指标 逻辑回归 逻辑回归是一种广义线性模型&#xff0c;形式上引入了 S i g m o i d Sigmoid Sigmoid 函数…

波奇学C++:C++11的可变参数模板和emplace

可变参数模板 // args是参数包 template<class T,class ...Args> void _ShowList(T value, Args... args) {cout << sizeof...(args) << endl; // 2cout << value << " ";/*_ShowList(args...);*/} int main() {_ShowList(1,2,3); re…

快速了解ChatGPT(大语言模型)

目录 GPT原理&#xff1a;文字接龙&#xff0c;输入一个字&#xff0c;后面会接最有可能出现的文字。 GPT4 学会提问&#xff1a;发挥语言模型的最大能力 参考李宏毅老师的课快速了解大语言模型做的笔记&#xff1a; Lee老师幽默的开场&#xff1a; GPT&#xff1a;chat Ge…

SQL server 基线安全加固操作

账号管理、认证授权 ELK-Mssql-01-01-01 编号 ELK-Mssql-01-01-01 名称 为不同的管理员分配不同的账号 实施目的 应按照用户分配账号&#xff0c;避免不同用户间共享账号,提高安全性。 问题影响 账号混淆&#xff0c;权限不明确&#xff0c;存在用户越权使用的可能。 …

Kafka的存储机制和可靠性

文章目录 前言一、Kafka 存储选择二、Kafka 存储方案剖析三、Kafka 存储架构设计四、Kafka 日志系统架构设计4.1、Kafka日志目录布局4.2、Kafka磁盘数据存储 五、Kafka 可靠性5.1、Producer的可靠性保证5.1.1、kafka 配置为 CP(Consistency & Partition tolerance)系统5.1.…

Pandas进阶:transform 数据转换的常用技巧

引言 本次给大家介绍一个功能超强的数据处理函数transform&#xff0c;相信很多朋友也用过&#xff0c;这里再次进行详细分享下。 transform有4个比较常用的功能&#xff0c;总结如下&#xff1a; 转换数值 合并分组结果 过滤数据 结合分组处理缺失值 一. 转换数值 pd.…

Linux常用命令——mv命令

文章目录 1. 简介2. 命令格式3. 主要参数4. 常见用法及示例4.1 移动文件4.2 重命名文件4.3 交互式移动文件4.4 强制移动文件4.5 移动多个文件4.6 使用通配符移动文件 5. 注意事项6. 结论 1. 简介 mv 命令在Linux系统中用于移动文件或目录&#xff0c;同时也可以用于重命名文件…

解决antd upload自定义上传customRequest,上传时一直loading加载的问题

问题&#xff1a;antd自定义上传customRequest时&#xff0c;无法正常显示上传成功状态&#xff0c;一直在上传的loading状态中。 查看customRequest参数 解决方法&#xff1a;调用onSuccess事件&#xff0c;解决loading一直加载的问题。 <template><a-uploadref&q…

cmake和vscode 下的cmake的使用详解(一)。

本文的内容 参考如下内容。 1.【基于VSCode和CMake实现C/C开发 | Linux篇】https://www.bilibili.com/video/BV1fy4y1b7TC?vd_source0ddb24a02523448baa69b0b871ab50f7 2.Notion – The all-in-one workspace for your notes, tasks, wikis, and databases. 3.关于如何利用…

11.30_黑马Redis实战篇分布式锁

实战篇9 设立一个在jvm外的锁监视器&#xff0c;可以处理多线程的问题 实战篇10 获取锁的时候&#xff0c;要同时发生获取锁以及设置到期时间。 实战篇11 thinking&#xff1a;JAVA中的自动拆箱与装箱&#xff1f; 【Java基础】自动拆装箱_Elephant_King的博客-CSDN博客 TR…

SQL Sever 基础知识 - 数据筛选

SQL Sever 基础知识 - 四、数据筛选 四、筛选数据第1节 DISTINCT - 去除重复值1.1 SELECT DISTINCT 子句简介1.2 SELECT DISTINCT 示例1.2.1 DISTINCT 一列示例1.2.2 DISTINCT 多列示例 1.2.3 DISTINCT 具有 null 值示例1.2.4 DISTINCT 与 GROUP BY 对比 第2节 WHERE - 过滤查询…