1. 外观数列
外观数列
这道题本质上是统计字符串中连续且相同的字符个数,依据题意模拟即可。
解题思路:
- 模拟 + 双指针:用双指针标记相同连续字符的区间,遍历字符串,拼接区间的结果即可。
classSolution{public:stringcountAndSay(intn){string ret="1";for(inti=1;i<n;i++){string s="";intlen=ret.size();for(intleft=0,right=0;right<len;){while(right<len&&ret[left]==ret[right]){right++;}s+=to_string(right-left)+ret[left];//注意两个字符串的作用!left=right;}ret=s;}returnret;}};2. 数青蛙
数青蛙
解题思路:
- 模拟:模拟青蛙的叫声,假设青蛙的叫声是一个持续的
croak
- 当遇到
r, o, a, k这四个字符的时候,去看每一个字符对应的前驱字符,看是否可以和之前的叫声拼接:如果有,则继续向后直至末尾;如果没有,直接返回-1。 - 当遇到
c字符的时候,由于题目要求青蛙的数目最少,因此在开始记录叫声前,先看看k字符是否存在青蛙:如果有,则让这个青蛙继续从c开始向后持续叫;如果没有,则添加一只新青蛙,再开始。
小巧思:在判断字符时可以使用哈希映射的方法,使用unordered_map存储croak,字符的下标为key,字符为value,这样就避免重复写if-else了。
classSolution{public:intminNumberOfFrogs(string croakOfFrogs){string t="croak";intn=t.size();unordered_map<char,int>hash;vector<int>pos(t.size(),0);//哈希表存下标for(inti=0;i<n;i++){hash[t[i]]=i;}for(autoch: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(inti=0;i<n-1;i++){if(pos[i]!=0){return-1;}}returnpos[n-1];}};// 本期内容就到这里啦,如果对你有帮助,请三连支持!我是青云,我们下期见^_~