43. 数青蛙
题目链接:
题目描述:
给你一个字符串 croakOfFrogs,它表示不同青蛙发出的蛙鸣声的组合。由于青蛙只能按顺序发出 "croak",所以返回该字符串中同时出现的青蛙的最小数量。如果字符串不是由有效的蛙鸣声组成,返回 -1。
题目示例:
(此处省略图片,逻辑同上)
解法(模拟 + 分情况讨论):
算法思路:
模拟青蛙的叫声。
- 当遇到
'r','o','a','k'这四个字符的时候,我们要去看看每一个字符对应的前驱字符,有没有青蛙叫出来。如果有青蛙叫出来,那么就让这个青蛙接下来喊出这个字符;如果没有,直接返回-1; - 当遇到
'c'这个字符的时候,我们去看看'k'这个字符有没有青蛙叫出来。如果有,就让这个青蛙继续去'c'这个字符;如果没有的话,就重新整一个青蛙出来。
C++ 算法代码:
class Solution {
public:
int minNumberOfFrogs(string croakOfFrogs) {
string s = "croak";
int n = s.size();
unordered_map<char, int> index;
vector<int> hash(n);
for (int i = 0; i < n; i++) index[s[i]] = i;
for (auto& ch : croakOfFrogs) {
if (ch == 'c') {
if (hash[n - 1] != 0) hash[n - 1]--;
hash[]++;
} {
t = index[ch];
(hash[t - ] == ) ;
hash[t - ]--, hash[t]++;
}
}
( i = ; i < n - ; i++) (hash[i] != ) ;
hash[n - ];
}
};

