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