LeetCode/外观数列
给定一个正整数 n ,输出外观数列的第 n 项
「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述
1. 递归
判断相邻相等的方法每次只能处理上一个值
等价于每次比较上一个组的末位置与当前组的初始位置
最后一个值要额外处理
class Solution {
public:
string countAndSay(int n) {
if(n==1) return "1";//递归边界
string s=countAndSay(n-1);//从上一层结果继续生成
string ans="";
int count=1;//初始值为1
for(int i=1;i<s.length();i++){
if(s[i]==s[i-1]) count++;//相等则计数加
else{
ans+=(to_string(count)+s[i-1]);//否则先输出前一个值
count=1;//重置计数
}
}
return ans+to_string(count)+s.back();//这里要补上最后一组字符
}
};
2. 遍历
判断组头是否相等可以避免额外处理,统一操作
使用两个下标记录位置
class Solution {
public:
string countAndSay(int n) {
string prev = "1";
for (int i = 2; i <= n; ++i) {
string curr = "";//重置cur
int start = 0;//当前组起始位置
int pos = 0;//当前组末位置
while (pos < prev.size()) {//遍历所有字符
while (pos < prev.size() && prev[pos] == prev[start])
pos++;//定位到不重复位置
curr += to_string(pos - start) + prev[start];
start = pos;
}
prev = curr;//更新pre
}
return prev;
}
};