【算法】模拟算法——数青蛙(medium)

题解:模拟算法——数青蛙(medium)

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

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值