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. 数青蛙
解题思路:
- 模拟 :模拟青蛙的叫声,假设青蛙的叫声是一个持续的
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];
}
};
// 本期内容就到这里啦,如果对你有帮助,请三连支持!我是青云,我们下期见^_~