【剑斩OFFER】算法的暴力美学——数青蛙

一、题目描述

二、算法原理

我们用一个哈希表来统计 croak 每个字符出现的次数,我们重头开始遍历原数组,我们先聊一下除了遍历到字符 "c" 的情况:

假设我们遍历到字符 "r" ,我们先看一下 "r" 前面的 "c" 出现的次数,如果等于0,表示没有青蛙叫出:"c",这是违规的,所以我们要返回 -1,不等于0,那么前面出现的字符 "c" 次数减1,当前字符 "r" 在哈希表的次数要加一。

重复上面的操作,当我们遍历一个完整的 croak 字符串时,字符 'k' 的次数为1,所以当我们再次遍历到字符 "c" 时,我们先要看的是 "k" 字符的次数是否为0,如果等于0,那么代表没有青蛙完整的叫出 croak ,所以我们要让 "c" 字符在哈希表的次数加1,反之我们要让 "k" 在哈希表的次数减1,而字符 "c" 在哈希表的次数要加1,代表着我们要完整的叫出 croak 的青蛙重新开始叫,所以我们要 "k" 在哈希表的次数减1。

一套操作下来,哈希表的情况应该是 "k" 有次数,而其他的字符都为0,如果其他的字符不为0,这代表着有青蛙没有完整的叫出来,此时返回 -1.

三、代码实现

cpp 复制代码
class Solution {
public:
    int minNumberOfFrogs(string croakOfFrogs) {
        unordered_map<char,int> hash;
        unordered_map<char,int> tmp;
        string s = "croak";
        for(int j = 0;j < s.size();j++)
        {
            tmp[s[j]] = j;//保存该字符的下标,当我们查找他上一个的字符时可以快速找到
            hash[s[j]] = 0;
        }

        for(int i = 0; i < croakOfFrogs.size();i++)
        {
            char ch = croakOfFrogs[i];
            if(ch == 'c')
            {
                if(hash['k'])
                {
                    hash['k']--;
                    hash[ch]++;
                }
                else
                    hash[ch]++;
            }
            else
            {
                int prech = tmp[ch] - 1;//该字符的上一个字符的下标
                if(hash[s[prech]])//该字符的上一个字符存在
                {
                    hash[s[prech]]--;
                    hash[ch]++;
                }
                else return -1;//不存在,则代表前面没有青蛙叫,这就是违规情况
            }
        }
        for(int i = 0; i < s.size() - 1;i++)
        {
            if(hash[s[i]]) return -1;//表示除 "k" 之外的还要字符被叫了,但是没有叫出完整的 croak
        }
        return hash['k'];//"k" 表示有多少个字符完整的叫出 croak
    }
};
相关推荐
m0_639397291 小时前
代码随想录算法训练营第三十九天|198.打家劫舍,213.打家劫舍II,337.打家劫舍III
算法
heisd_11 小时前
KNN 算法和 K means算法和 Q-Learning 算法(简单的理解)
算法
TL滕1 小时前
从0开始学算法——第六天(进阶排序算法)
笔记·学习·算法·排序算法
TL滕2 小时前
从0开始学算法——第六天(进阶排序算法练习)
笔记·python·学习·算法·排序算法
課代表2 小时前
正弦函数与椭圆的关系
数学·算法·几何·三角函数·椭圆·正弦·周长
zl_vslam2 小时前
SLAM中的非线性优-3D图优化之相对位姿Between Factor(七)
人工智能·算法·计算机视觉·3d
CoderYanger2 小时前
动态规划算法-简单多状态dp问题:12.打家劫舍Ⅱ
开发语言·算法·leetcode·职场和发展·动态规划·1024程序员节
一水鉴天2 小时前
专题讨论 类型理论和范畴理论之间的关系:闭关系/闭类型/闭范畴 与 计算式(ima.copilot)
开发语言·算法·架构
元素之窗2 小时前
MATLAB 的“面子工程”:一键切换数值显示风格 —— format 命令小记
开发语言·算法·matlab