数青蛙 ---- 模拟

题目链接

题目:

分析:

  • 题目的意思是:
    一次蛙鸣是一个完整的字符串"croak", 给你一个字符串, 让你求出最少的青蛙数目
    示例一: 两次完整的"croak", 可以由一只青蛙完成, 所以答案为1
    示例二: 第一次蛙鸣还没有结束, 又出现了"c", 说明有第二只青蛙, 所以答案为2
    示例三: 如果有无效的字符, 或蛙鸣不完整, 直接返回-1
  • 我们可以借助哈希表<Character,Integer>
    • 在遍历字符串时, 如果出现"r"字符, 我们要看他前面即"c" 在哈希表中是否存在, 有两种情况:
      如果存在说明此时的"r"是有效字符, 将"c"对应的数量--, 将"r"对应的数量++
      如果不存在, 说明"r"无效, 直接返回-1
    • 同理, 出现"o""a""k", 也要找他们前面的字符在哈希表中的数量是否为0
    • 那么此时, 如果有一次完整的蛙鸣, 那么在"k"对应的数量就会存储下来
    • 如果出现"c", 我们要看是否有已经完成蛙鸣的青蛙(因为我们要找的是最小的数量), 这个数量是存储到"k"对应的哈希表中的, 分两种情况:
      如果"k"对应的哈希表为0, 说明前面没有空闲的青蛙, 所以应该增加蛙的数量, 让"c"对应的哈希表++
      如果"k"对应的哈希表不为0, 说明有空闲的青蛙, 让"k"哈希表--,"c"哈希表++即可
  • 在实现代码时, 我们不需要真的创建哈希表, 只需要用哈希数组即可, 0下标对应"c", 1下标对应"r"...., 想要找到前一个字符的位置, 只需要用String中的index()方法找到下标, 再-1即可

代码:

java 复制代码
class Solution {
    public int minNumberOfFrogs(String croakOfFrogs) {
        String str = "croak";
        int n = str.length();
        char[] arr = croakOfFrogs.toCharArray();
        int[] hash = new int[n];
        for (char x : arr) {
            if (x == str.charAt(0)) {
                if (hash[n - 1] != 0)
                    hash[n - 1]--;
                hash[0]++;

            } else {
                int i = str.indexOf(x);
                if (hash[i - 1] == 0)
                    return -1;
                hash[i - 1]--;
                hash[i]++;
            }
        }
        for (int i = 0; i < hash.length - 1; i++) {
            if (hash[i] != 0)
                return -1;
        }
        return hash[n - 1];

    }
}
相关推荐
blackicexs7 小时前
第四周第四天
数据结构·c++·算法
TracyCoder1237 小时前
LeetCode Hot100(46/100)——74. 搜索二维矩阵
算法·leetcode·矩阵
foundbug9997 小时前
果蝇优化算法(FOA)详解:原理、实现与应用
算法
游乐码7 小时前
c#递归函数
算法·c#
Pluchon7 小时前
硅基计划4.0 算法 简单实现B树
java·数据结构·b树·算法·链表
im_AMBER7 小时前
Leetcode 119 二叉树展开为链表 | 路径总和
数据结构·学习·算法·leetcode·二叉树
Eloudy7 小时前
SuiteSparse 的 README
人工智能·算法·机器学习·hpc
苏荷水8 小时前
万字总结LeetCode100(持续更新...)
java·算法·leetcode·职场和发展
gihigo19988 小时前
MATLAB运动估计基本算法详解
开发语言·算法·matlab
hetao17338378 小时前
2026-02-09~02-12 hetao1733837 的刷题记录
c++·算法