题解:模拟算法——数青蛙(medium)
目录
- 1.题目
- 2.题解
- 3.参考代码
- 4.总结
1.题目
题目链接:LINK
2.题解
用循环进行遍历,
- 如果该字符为o\o\a\k 找一下前驱字符是否存在
- 如果存在,前驱字符–,该字符++
- 如果不存在,返回-1
- 如果该字符为c,找一下最后一个字符是否有数
- 如果最后一个数非0,最后一个字符–,当前字符++
- 最后一个数是0,当前字符++
3.参考代码
不用哈希表,缺点是这个字符串字符种类太多时会不适用。
class Solution {
public:
int minNumberOfFrogs(string croakOfFrogs) {
//哈希数组
int arr[5] = {0};//c r o a k
//0标识c,1标识r,2标识o,3标识a,4标识k
for(auto& ch: croakOfFrogs)
{
if(ch == 'c')
{
if(arr[4] == 0) arr[0]++;
else arr[4]--,arr[0]++;
}
else if(ch == 'r')
{
if(arr[0] != 0) arr[0]--,arr[1]++;
else return -1;
}
else if(ch == 'o')
{
if(arr[1] != 0) arr[1]--,arr[2]++;
else return -1;
}
else if(ch == 'a')
{
if(arr[2] != 0) arr[2]--,arr[3]++;
else return -1;
}
else if(ch == 'k')
{
if(arr[3] != 0) arr[3]--,arr[4]++;
else return -1;
}
}
if((arr[0] + arr[1] + arr[2] + arr[3]) != 0) return -1;
return arr[4];
}
};
用哈希表,好处是可以适用字符串字符种类很大的时候
class Solution {
public:
int minNumberOfFrogs(string croakOfFrogs) {
string s = "croak";
int n = s.size();
//哈希数组
int hash[5] = {0};//c r o a k
//0标识c,1标识r,2标识o,3标识a,4标识k
//为了方便找到前一个字母的下标,我们用哈希表来记录一下
unordered_map<char,int> index;
for(int i = 0; i < n; i++)
{
index[s[i]] = i;
}
for(auto& ch: croakOfFrogs)
{
if(ch == 'c')
{
if(hash[n-1] == 0) hash[0]++;
else hash[n-1]--,hash[0]++;
}
else
{
int i = index[ch];//取到该字符对应的下标
if(hash[i-1] != 0) hash[i-1]--,hash[i]++;
else return -1;
}
}
for(int i = 0; i < n-1; i++)
if(hash[i]!=0) return -1;
return hash[n-1];
}
};
这个地方为什么用哈希表呢?主要是为了方便找到对应字符的下标。
4.总结
这个题的解题思路挺好,然后用哈希表存下标写代码是一个不错的选择。
EOF