C++ 中青蛙鸣叫的最小数量
假设我们有一个名为 croakOfFrogs 的字符串,它表示来自不同青蛙的“croak”字符串的组合,多只青蛙可以同时鸣叫,因此多个“croak”混合在一起。我们必须找到完成给定字符串中所有“croak”的不同青蛙的最小数量。
这里有效的“croak”表示一只青蛙按顺序发出 5 个字母“c”、“r”、“o”、“a”、“k”。青蛙必须发出所有五个字母才能完成一次鸣叫。如果字符串不是有效的“croak”字符串,则返回 -1。
因此,如果输入类似于“crcoakroak”,则输出将为 2,因为第一只青蛙可以叫“crcoakroak”。第二只青蛙可以在稍后叫“crcoakroak”。
为了解决这个问题,我们将遵循以下步骤:
定义一个映射 m
定义一个大小为 5 的数组 ch,并将其赋值为 {'c', 'r', 'o', 'a', 'k'}
temp := 0, ret := 0
对于 s 中的每个元素 c,执行以下操作:
(将 m[c] 增加 1)
maxVal := m[ch[0]]
初始化 i := 0,当 i < 5 时,更新(将 i 增加 1),执行以下操作:
如果 maxVal < m[ch[i]] 或 m[ch[i]] < 0,则:
返回 -1
maxVal := m[ch[i]]
如果 c 与 'c' 相同,则:
(将 temp 增加 1)
否则,当 c 与 'k' 相同,则:
(将 temp 减少 1)
ret := ret 和 temp 的最大值
初始化 i := 1,当 i < 5 时,更新(将 i 增加 1),执行以下操作:
如果 m[ch[0]] 不等于 m[ch[i]],则:
返回 -1
返回 ret
示例
让我们查看以下实现以更好地理解:
#include <bits/stdc++.h> using namespace std; class Solution { public: int minNumberOfFrogs(string s) { map<char, int> m; char ch[5] = { 'c', 'r', 'o', 'a', 'k' }; int temp = 0; int ret = 0; for (auto& c : s) { m[c]++; int maxVal = m[ch[0]]; for (int i = 0; i < 5; i++) { if (maxVal < m[ch[i]] || m[ch[i]] < 0) { return -1; } maxVal = m[ch[i]]; } if (c == 'c') { temp++; } else if (c == 'k') { temp--; } ret = max(ret, temp); } for (int i = 1; i < 5; i++) { if (m[ch[0]] != m[ch[i]]) return -1; } return ret; } }; main(){ Solution ob; cout << (ob.minNumberOfFrogs("crcoakroak")); }
输入
"crcoakroak"
输出
2
广告