当前位置: 首页 > news >正文

6.4 模拟专题:LeetCode1419.数青蛙

1.题目链接:数青蛙 - LeetCode


2.题目描述

给定一个字符串 croakOfFrogs,表示青蛙的鸣叫声序列。每个青蛙必须按顺序发出完整的 “croak” 字符,且多只青蛙可以同时鸣叫。要求计算最少需要多少只青蛙才能完成该字符串,若无法完成则返回 -1

示例
输入:"croakcroak",输出:1(一只青蛙可重复鸣叫两次)。


3.示例分析

以输入 "crcoakroak" 为例,分析过程如下:

  1. 第一个 ‘c’ 开始,对应青蛙1。
  2. 遇到第二个 ‘c’ 时,没有已完成的青蛙(此时青蛙1未完成),需新增青蛙2。
  3. 最终青蛙1和青蛙2交替完成各自的 “croak”,最终需要2只青蛙。

4.算法思路

核心思想

通过状态哈希表跟踪每个字符的状态,确保字符顺序合法,并复用已完成鸣叫的青蛙。

具体步骤

  1. 状态定义:使用数组 hash 记录每个字符(‘c’,‘r’,‘o’,‘a’,‘k’)的出现次数。
  2. 字符处理
    • 遇到 ‘c’ 时,优先复用已完成鸣叫的青蛙(hash[4] > 0)。
    • 遇到其他字符时,必须存在前一个字符的状态(如 ‘r’ 前必须有 ‘c’)。
  3. 状态转移:每个字符处理时,减少前驱字符计数,增加当前字符计数。
  4. 结果验证:最终所有中间状态(‘c’,‘r’,‘o’,‘a’)必须清零,hash[4] 的值即为最少青蛙数。

5.边界条件与注意事项

  1. 非法顺序:若字符出现时其前驱状态不存在(如直接出现 ‘r’ 而无 ‘c’),返回 -1
  2. 未完成状态:遍历结束后若中间状态未清零,说明存在未完成的鸣叫,返回 -1
  3. 首字符处理:遇到 ‘c’ 时若无可复用青蛙,需新增计数。

6.代码实现

class Solution {
public:
    int minNumberOfFrogs(string croakOfFrogs) {
        string base = "croak";
        int n = base.size();
        vector<int> hash(n, 0); // 记录各字符的状态数
        unordered_map<char, int> index; // 字符到索引的映射
        
        for (int i = 0; i < n; ++i) 
            index[base[i]] = i;
        
        for (char ch : croakOfFrogs) {
            int idx = index[ch];
            if (ch == 'c') {
                // 复用已完成鸣叫的青蛙
                if (hash[n-1] > 0) hash[n-1]--;
                hash[0]++;
            } else {
                // 检查前驱状态是否存在
                if (hash[idx-1] == 0) return -1;
                hash[idx-1]--;
                hash[idx]++;
            }
        }
        
        // 验证中间状态是否清零
        for (int i = 0; i < n-1; ++i) {
            if (hash[i] != 0) return -1;
        }
        return hash[n-1];
    }
};

在这里插入图片描述


7.总结

本算法通过维护字符状态哈希表,实现了对青蛙鸣叫过程的精准模拟,时间复杂度为 O(n),空间复杂度 O(1)。关键在于复用青蛙和严格的状态转移检查,确保算法的效率与正确性。

相关文章:

  • 第二届图像处理与人工智能国际学术会议(ICIPAI2025)
  • vue3 使用vue3-print-nb main.ts报错声明文件找不到
  • 关于kafka的一些知识总结
  • LIMS系统的价值-选择哪家比较合适
  • 登录接口带验证码自动化(tesseract-OCR)
  • 辉视智慧月子中心:爱与科技共筑母婴温馨港湾
  • 记一次数字前端设计面试(含问题和verilog设计)
  • Vue3可用的图片预览插件【vue3-photo-preview】
  • Android第六次面试总结(自定义 View与事件分发)
  • trae 配置 gradle springboot项目
  • 【gradio】从零搭建知识库问答系统-Gradio+Ollama+Qwen2.5实现全流程
  • java中MyBatis项目的搭建与配置
  • MaxKB 如何通过Nginx修改浮框提示文字
  • 【记录】并行运行olmocr把服务器跑崩
  • vmware虚拟机突然连不上网
  • EF Core 异步方法
  • 高性能 Android 自定义 View:数据渲染与事件分发的双重优化
  • @Resource 与 @Autowired:Spring 中的依赖注入注解大比拼
  • gz sim机器人SDF模型 [持续更新]
  • trino查询mysql报Unknown or incorrect time zone: ‘Asia/Shanghai‘
  • 有哪些可以做推广的网站/搜索引擎的三个技巧
  • 网站建设存在风险/阐述网络营销策略的内容
  • 武汉网站建设报价/企业seo外包公司
  • 网站seo好学吗/韶山百度seo
  • 北京模板网站制作/关键词怎样做优化排名
  • 拉萨工商做年检网站/温州百度推广公司电话