[LC优选算法#14] 模拟 | 外观数列 | 数青蛙

1. 外观数列

外观数列

这道题本质上是统计字符串中连续且相同的字符个数,依据题意模拟即可。

解题思路:

  1. 模拟 + 双指针:用双指针标记相同连续字符的区间,遍历字符串,拼接区间的结果即可。
cpp 复制代码
class Solution {
public:
    string countAndSay(int n)
    {
        string ret = "1";

        for(int i=1; i<n; i++)
        {
            string s = "";
            int len = ret.size();
            for(int left=0, right=0; right < len;)
            {
                while(right < len && ret[left] == ret[right])
                {
                    right++;
                }

                s += to_string(right - left) + ret[left]; //注意两个字符串的作用!
                left = right;
            }

            ret = s;
        }

        return ret;
    }
};

2. 数青蛙

数青蛙

解题思路:

  1. 模拟 :模拟青蛙的叫声,假设青蛙的叫声是一个持续的croak
  • 当遇到r, o, a, k这四个字符的时候,去看每一个字符对应的前驱字符 ,看是否可以和之前的叫声拼接 :如果有,则继续向后直至末尾;如果没有,直接返回-1
  • 当遇到c字符的时候,由于题目要求青蛙的数目最少 ,因此在开始记录叫声前,先看看k字符是否存在青蛙:如果有,则让这个青蛙继续c开始向后持续叫;如果没有,则添加一只新青蛙,再开始。

小巧思 :在判断字符时可以使用哈希映射 的方法,使用unordered_map存储croak,字符的下标为key,字符为value,这样就避免重复写if-else了。

cpp 复制代码
class Solution {
public:
    int minNumberOfFrogs(string croakOfFrogs)
    {
        string t = "croak";
        int n = t.size();
        unordered_map<char, int> hash;
        vector<int> pos(t.size(), 0);

        //哈希表存下标
        for(int i=0; i<n; i++)
        {
            hash[t[i]] = i;
        }

        for(auto ch : croakOfFrogs)
        {
            //c字符
            if(ch == 'c')
            {
                if(pos[n - 1] != 0)
                {
                    pos[n - 1]--;
                }

                pos[0]++;
            }
            //其他字符
            else
            {
                if(pos[hash[ch] - 1] != 0)
                {
                    pos[hash[ch] - 1]--;
                    pos[hash[ch]]++;
                }
                else
                {
                    return -1;
                }
            }
        }

        for(int i=0; i<n-1; i++)
        {
            if(pos[i] != 0)
            {
                return -1;
            }
        }

        return pos[n - 1];
    }
};

// 本期内容就到这里啦,如果对你有帮助,请三连支持!我是青云,我们下期见^_~