- 找规律
- 从后向前思考,有 k 时必须有 a,有 a 时前面必须有 o,并且一一对应
- 由此构建哈希表,比如出现 k,则出现 a 的次数减一,k 则加一
- 处理 c 的起始情况
- 异常情况的判断:若出现 roak中的一个,前面没有与之对应的前一个字符,则返回-1;
- 最后返回值为 k 的个数,前提是此时哈希表中其他字符计数为0
cpp
class Solution {
public:
int minNumberOfFrogs(string croakOfFrogs) {
string s = "croak";
unordered_map<char, int> index; // 每个字符与下标映射
for(int i = 0; i < s.size(); i++)
index[s[i]] = i;
vector<int> hash(s.size());
for(int i = 0; i < croakOfFrogs.size(); i++)
{
if(croakOfFrogs[i] == s[0])
{
if(hash[s.size() - 1] != 0)
hash[s.size() - 1]--;
hash[0]++;
}
else
{
if(hash[index[croakOfFrogs[i]] - 1] == 0)
return -1;
hash[index[croakOfFrogs[i]] - 1]--;
hash[index[croakOfFrogs[i]]]++;
}
}
for(int i = 0; i < s.size() - 1; i++)
{
if(hash[i] != 0)
return -1;
}
return hash[s.size() - 1];
}
};