【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

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

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

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

相关推荐
晚风吹长发10 小时前
初步了解Linux中文件描述符-fd
linux·运维·服务器·c++·开发·文件
赖small强10 小时前
【Linux C/C++开发】Linux C/C++ 高效延迟崩溃分析:基于 mprotect 的内存陷阱技术 (Electric Fence)
linux·c语言·c++·mprotect·buffer overflow
繁华似锦respect10 小时前
C++ & Linux 中 GDB 调试与内存泄漏检测详解
linux·c语言·开发语言·c++·windows·算法
立志成为大牛的小牛10 小时前
数据结构——五十四、处理冲突的方法——开放定址法(王道408)
数据结构·学习·程序人生·考研·算法
锡兰_CC10 小时前
无缝触达,卓越体验:开启openEuler世界的任意门
服务器·网络·数据库·c++·图像处理·qt·nginx
王燕龙(大卫)10 小时前
滑动窗口问题记录
c++
代码游侠10 小时前
复习——栈、队列、树、哈希表
linux·数据结构·学习·算法
不会代码的小猴10 小时前
C++的第十二天笔记
开发语言·c++·笔记
橘子真甜~10 小时前
C/C++ Linux网络编程10 - http协议
linux·服务器·网络·c++·网络协议·http
碧海银沙音频科技研究院11 小时前
基于物奇wq7036与恒玄bes2800智能眼镜设计
arm开发·人工智能·深度学习·算法·分类