总结
总体是模拟的思路,需要特殊处理进入判断时候j==0的情况。另外还要特殊处理结尾j == size-1的情况。 这两种特殊情况的处理,分别用if写在开始和结尾,开始的使用continue,结尾的直接进行特判。整体逻辑比较清晰,最大的减少对中间代码的干扰。
代码
class Solution {
public:
string countAndSay(int n) {
vector<string> dp(n+2);
dp[1]="1";
dp[2]="11";
if(n==1||n==2)return dp[n];
for(int i=3;i<=n;i++){
string prev=dp[i-1];
char cur='\0';
int num=0;
string ans="";
for(int j=0;j<prev.size();j++){
if(j==0){
cur=prev[0];
num=1;
continue;
}
if(prev[j]!=cur){
ans+=to_string(num)+cur;
cur=prev[j];
num=1;
}
else{
num++;
}
//末尾元素的压入处理应该放在最后
if(j==prev.size()-1){
ans+=to_string(num)+cur;
}
}
dp[i]=ans;
}
return dp[n];
}
};