C ++中青蛙鸣叫的最小数量
假设我们有一个名为croakOfFrogs的字符串,它表示来自不同青蛙的字符串“croak”的组合,多个青蛙可以同时鸣叫,因此多个“croak”混合在一起。我们必须找到最少数量的不同青蛙,才能完成给定琴弦中所有的叫声。
在这里,有效的“cro”表示青蛙正在顺序生成5个字母“c”,“r”,“o”,“a”,“k”。青蛙必须产生所有五个字母才能发出嘶哑声。如果该字符串不是有效的“croak”字符串,则返回-1。
因此,如果输入像“crcoakroak”,则输出将为2,因为第一个青蛙可能会大喊“crcoakroak”。第二只青蛙以后可能会大喊“crakakroak”。
为了解决这个问题,我们将遵循以下步骤-
定义一张映射
定义大小为ch的数组:5为其分配{'c','r','o','a','k'}
温度:=0,ret:=0
对于s中的每个元素c,
(将温度降低1)
(将温度提高1)
如果maxVal<m[ch[i]]或m[ch[i]]<0,则-
maxVal:=m[ch[i]]
返回-1
(将m[c]增加1)
maxVal:=m[ch[0]]
对于初始化i:=0,当i<5时,更新(将i增加1),请执行-
如果c与'c'相同,则-
否则,当c与'k'相同时,则-
ret:=ret和temp的最大值
对于初始化i:=1,当i<5时,更新(将i增加1),请执行-
返回-1
如果m[ch[0]]不等于m[ch[i]],则-
返回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