【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

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

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

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

相关推荐
٩( 'ω' )و2602 分钟前
哈希表的实现01
数据结构·c++·哈希算法·散列表
程序员三藏5 分钟前
软件测试之功能测试详解
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
靡樊10 分钟前
网络基础概念
linux·服务器·网络·c++·学习
君鼎12 分钟前
TCP/IP-——C++编程详解
网络·c++·tcp/ip
whoarethenext16 分钟前
c/c++爬虫总结
c语言·c++·爬虫
一只努力学习的Cat.28 分钟前
C++:二叉搜索树
开发语言·c++
<但凡.28 分钟前
C++修炼:多态
开发语言·c++·算法
工藤新一¹33 分钟前
深度理解指针(2)
c++·指针·c 语言·深度理解指针
买了一束花34 分钟前
数据预处理之数据平滑处理详解
开发语言·人工智能·算法·matlab
小雅痞41 分钟前
[Java][Leetcode simple]26. 删除有序数组中的重复项
java·leetcode