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

「优选算法刷题」:数青蛙

一、题目

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

二、思路解析

这道题的关键就在于,我们需要判断每⼀个字符对应的前驱字符是否存在,没有的话就不可能拼凑成一个完整的 croak 单词。

然后,还需要分情况讨论,因为前驱字符可以先存起来,也可以只出现一次,所以我们需要用到哈希表来记录每个字符及其出现次数。

●当遇到  'r' 'o' 'a' 'k' 这四个字符的时候,我们要去看看每⼀个字符对应的前驱字符,有没有⻘蛙叫出来。

如果有⻘蛙叫出来,那就让这个⻘蛙接下来喊出来这个字符;如果没有,直接返回  -1 ;

●当遇到 'c' 这个字符的时候,我们去看看 'k' 这个字符有没有⻘蛙叫出来。

如果有,就让这个⻘蛙继续去喊 'c' 这个字符;如果没有的话,就重新搞⼀个⻘蛙。

三、完整代码

class Solution {
    public int minNumberOfFrogs(String c) {
        String croak = "croak";
        char[] croakOfFrogs = c.toCharArray();
        int n = croak.length();
        int[] hash = new int[n];

        Map<Character , Integer> index = new HashMap<Character , Integer>();
        for(int i = 0 ; i < n ; i ++){
            index.put(croak.charAt(i) , i);
        }

        for(char ch : croakOfFrogs){
            if(ch == croak.charAt(0)){
                if(hash[n - 1] != 0){
                    hash[n - 1] --;
                }
                hash[0] ++;
            }else{
                int i = index.get(ch);
                if(hash[i - 1] == 0){
                    return -1;
                }else{
                    hash[i - 1] --;
                    hash[i] ++;
                }
            }
        }

        for(int i = 0 ; i < n - 1 ; i ++){
            if(hash[i] != 0){
                return -1;
            }
        }
        return hash[n - 1];

    }
}

以上就是本篇博客的全部内容啦,如有不足之处,还请各位指出,期待能和各位一起进步!


http://www.kler.cn/news/234180.html

相关文章:

  • 如何系统的自学Python?通义千问、讯飞星火、文心一言及ChatGPT的回答
  • 复习面经哦
  • effective c++ 笔记 条款13-18
  • 飞天使-k8s知识点14-kubernetes散装知识点3-Service与Ingress服务发现控制器
  • Python中使用multiprocessing模块创建进程
  • MYSQL笔记:约束条件
  • 算法||实现典型数据结构的查找、添加和删除数据 并分析其时间和空间复杂度
  • 最佳视频转换器软件:2024年视频格式转换的选择
  • React Emotion 如何优雅的使用样式(一)
  • 人物系统构建1
  • 使用raw.gitmirror.com替换raw.githubusercontent.com以解决brew upgrade python@3.12慢的问题
  • 问题:2、计算机网络的目标是实现________。 #媒体#知识分享
  • 第十六章 以编程方式使用 SQL 网关 - %SQLGatewayConnection 方法和属性
  • 知识图谱与图神经网络融合:构建智能应用的新前沿
  • [145] 二叉树的后序遍历 js
  • /etc/apt/sources.list 包含ubuntu18.04或bionic字样的解决思路
  • C语言字符常量与字符变量..
  • 前端修炼手册(uniapp的api篇)
  • Ansys方法基础
  • MacOS - M1芯片 Mac 在“恢复”模式中启用系统扩展教程
  • 更新win11后无法上网
  • Java继承和组合
  • 【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏17(附项目源码)
  • 如何解决利用cron定时任务自动更新SSL证书后Nginx重启问题
  • 如何从 iPhone 恢复已删除的视频:简单有效方法
  • 【漏洞复现】多语言药房管理系统MPMS文件上传漏洞
  • [论文总结] 深度学习在农业领域应用论文笔记12
  • LayUI中表格树折叠 --
  • Redis -- 安装客户端redis-plus-plus
  • 形态学算法之边界提取的简单python实现——图像处理