
题目链接:
问题描述
给定一个字符串 croakOfFrogs,表示若干只青蛙发出的叫声序列。每只青蛙必须按顺序发出 'c', 'r', 'o', 'a', 'k' 五个声音才能完成一次完整的叫声。如果字符串中的字符无法组成合法的叫声序列,则返回 -1;否则返回所需的最少青蛙数量。

解题思路
这本质上是一个状态机模拟问题。我们可以将青蛙的发声过程看作五个状态的流转:
- c: 开始叫
- r: 继续
- o: 继续
- a: 继续
- k: 结束
为了计算最少需要多少只青蛙,我们需要维护当前处于每个阶段的青蛙数量。当遇到一个新的字符时,检查是否有青蛙处于前一个阶段:
- 遇到 'c':优先复用已经发完 'k' 的青蛙(即从 'k' 状态回到 'c' 状态),如果没有可用的,说明需要新青蛙。无论哪种情况,该青蛙现在都处于 'c' 阶段。
- 遇到其他字符:必须存在一只青蛙正处于前驱字符的阶段。例如遇到 'r',必须有青蛙在 'c' 阶段。如果找不到,说明序列非法,直接返回 -1。
遍历结束后,所有青蛙都应该处于 'k' 阶段(即完成了叫声)。如果还有青蛙停留在中间任何阶段,说明序列不完整,返回 -1。
C++ 代码实现
class Solution {
public:
int minNumberOfFrogs(string croakOfFrogs) {
string s = "croak";
int n = s.size();
// 记录字符映射下标关系,方便查找前驱
unordered_map<char, int> index;
for (int i = 0; i < n; i++) {
index[s[i]] = i;
}
;
(& ch : croakOfFrogs) {
(ch == ) {
(hash[n - ] != ) {
hash[n - ]--;
}
hash[]++;
} {
t = index[ch];
(hash[t - ] == ) {
;
}
hash[t - ]--;
hash[t]++;
}
}
( i = ; i < n - ; i++) {
(hash[i] != ) {
;
}
}
hash[n - ];
}
};


