假设我们有一个名为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