【Leetcode每日一题】模拟 - 数青蛙(难度⭐⭐)(51)

1. 题目解析

题目链接:1419. 数青蛙

这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。

2.算法原理

一、模拟青蛙叫声的基本逻辑

在模拟青蛙叫声的过程中,我们需要遵循一定的规则来判断何时青蛙会发出声音。具体规则如下:

  1. 当遇到字符序列 'r'、'o'、'a'、'k' 时,我们需要检查每个字符之前是否已经有青蛙发出叫声。这是因为青蛙的叫声需要按照一定的顺序来触发,如果前面的字符没有被青蛙喊出,那么当前字符也无法被喊出。

  2. 对于字符 'r'、'o'、'a'、'k' 的检查,我们需要回溯到每个字符的前一个字符,查看是否有青蛙已经发出了叫声。如果有,则当前字符可以被青蛙喊出;否则,我们需要直接返回 -1,表示无法模拟出青蛙的叫声。

  3. 当遇到字符 'c' 时,情况稍有不同。我们需要特别检查字符 'k' 是否已经被青蛙喊出。这是因为 'c' 的叫声通常是在 'k' 的叫声之后发出的,作为一种特殊的叫声组合。如果 'k' 已经被喊出,那么青蛙可以继续喊出 'c';否则,我们需要重新开始模拟,即重新引入一个青蛙来尝试喊出这些字符。

二、算法执行的详细步骤

根据以上逻辑,我们可以将算法的执行过程细化为以下步骤:

  1. 初始化一个标志位,用于记录是否有青蛙发出叫声。
  2. 遍历输入的字符序列,对每个字符进行判断。
  3. 对于字符 'r'、'o'、'a'、'k',检查其前一个字符是否已经被青蛙喊出。如果是,则更新标志位,表示当前字符可以被喊出;否则,返回 -1。
  4. 对于字符 'c',检查字符 'k' 是否已经被喊出。如果是,则允许青蛙喊出 'c';否则,重新开始模拟过程。
  5. 如果遍历完整个字符序列后,青蛙成功地喊出了所有字符,则算法执行成功;否则,返回 -1 表示无法模拟出青蛙的叫声。

3.代码编写

cpp 复制代码
class Solution 
{
public:
    int minNumberOfFrogs(string croakOfFrogs) 
    {
        string s = "croak";
        int n = s.size();
        vector<int> hash(n);
        unordered_map<char, int> idx;
        for(int i = 0; i < n; i++) idx[s[i]] = i;
        for(const auto &ch : croakOfFrogs)
        {
            if(ch == 'c')
            {
                if(hash[n - 1]) hash[n - 1]--;
                hash[0]++;
            }
            else
            {
                if(hash[idx[ch] - 1] == 0) return -1;
                hash[idx[ch] - 1]--;
                hash[idx[ch]]++;
            }
        }
        for(int i = 0; i < n - 1; i++)
        {
            if(hash[i]) return -1;
        }
        return hash[n - 1];
    }
};

The Last

嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。

觉得有点收获的话,不妨给我点个吧!

如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~

相关推荐
谷雨不太卷1 小时前
进程的状态码
java·前端·算法
顾温1 小时前
default——C#/C++
java·c++·c#
凉茶钱2 小时前
【c语言】动态内存管理:malloc,calloc,realloc,柔性数组
c语言·c++·vscode·柔性数组
脏脏a2 小时前
【C++模版】泛型编程:代码复用的终极利器
开发语言·c++·c++模版
island13142 小时前
【C++仿Muduo库#3】Server 服务器模块实现上
服务器·开发语言·c++
散峰而望2 小时前
【算法竞赛】C/C++ 的输入输出你真的玩会了吗?
c语言·开发语言·数据结构·c++·算法·github
小龙报2 小时前
【C语言】内存里的 “数字变形记”:整数三码、大小端与浮点数存储真相
c语言·开发语言·c++·创业创新·学习方法·visual studio
躺不平的理查德2 小时前
时间复杂度与空间复杂度备忘录
数据结构·算法
yaki_ya2 小时前
yaki-C语言:从概念基础到内存解析---数组(array)完全指南
java·c语言·算法
刃神太酷啦2 小时前
扒透 STL 底层!map/set 如何封装红黑树?迭代器逻辑 + 键值限制全手撕----《Hello C++ Wrold!》(23)--(C/C++)
java·c语言·javascript·数据结构·c++·算法·leetcode