上篇文章:LeetCode模拟算法精解I:替换问号,提莫攻击与Z字形变换
目录
1.外观数列
https://leetcode.cn/problems/count-and-say/description/



理解题意
- 给一个数,这个数是1
- 描述上一步的数,这个数是 1 即一个1,故写作11
- 描述上一步的数,这个数是11即两个1,故写作21
- 描述上一步的数,这个数是21即一个2一个1,故写作12-11
- 描述上一步的数,这个数是1211即一个1一个2两个1,故写作11-12-21
算法原理
通过模拟和双指针,对给定的数字进行解释。
class Solution
{
public:
string countAndSay(int n)
{
string ret = "1";
for(int i = 1; i < n; i++) // 遍历
{
string tmp;
int len = ret.size();
for(int left = 0, right = 0; right < len; ) // 解释ret
{
while(right < len && ret[left] == ret[right])
{
right++;
}
tmp += to_string(right - left) + ret[left];
left = right;
}
ret = tmp;
}
return ret;
}
};
2.数青蛙
https://leetcode.cn/problems/minimum-number-of-frogs-croaking/description/


理解题意
计算在字符串中字符c,r,o,a,k出现的次数,只要顺序不变,出现次数合理,哪怕有若干个随意穿插,也属于有效字符。
算法原理
本题要求出现次数以及确定顺序和重复度,所以使用哈希表(数组模拟实现)进行判断。
基本判断如下:

class Solution
{
public:
int minNumberOfFrogs(string croakOfFrogs)
{
string t = "croak";
int n = t.size();
vector<int> hash(n); // 数组模拟哈希表
unordered_map<char, int> index; // 字符对应下标
for(int i = 0; i < n; i++)
{
index[t[i]] = i;
}
for(auto ch : croakOfFrogs)
{
if(ch == 'c')
{
if(hash[n - 1] != 0) hash[n - 1]--;
hash[0]++;
}
else
{
int i = index[ch];
if(hash[i - 1] == 0) return -1;
hash[i - 1]--; hash[i]++;
}
}
for(int i = 0; i < n - 1; i++)
{
if(hash[i] != 0)
return -1;
}
return hash[n - 1];
}
};
本章完。