题目
外观数列是一个数字字符串序列,由以下递归公式定义:
-
countAndSay(1) = "1" -
countAndSay(n)是countAndSay(n-1)的行程长度编码(Run-Length Encoding, RLE)
所谓行程长度编码,就是将字符串中每个最大连续相同字符组 替换为该组的长度 + 该字符本身。
例如,压缩字符串 "3322251":
-
"33"→"23"(2个3) -
"222"→"32"(3个2) -
"5"→"15"(1个5) -
"1"→"11"(1个1)
最终得到 "23321511"。
解法
这道题目我们采取双指针的方法


用 left 标记当前连续数字段起点 ,right 不断向右滑动寻找分段边界:
- 相等场景 :nums
[right] == nums[left]说明是同一段重复数字,只执行right++继续向后统计; - 不等场景 :nums
[right] !=nums[left]找到一段的终点,计算本段数字数量count = right - left; 拼接规则:count(个数) + s[left(当前数字)]; 再更新left = right,开启下一段统计;再实现的过程,count非string类型,要转换,用to_string - 循环直到
right走到字符串末尾,整轮遍历完成,生成下一层外观数列。


cpp
#include<string>
class Solution {
public:
string countAndSay(int n) {
string s1;
s1+='1';
for(int i=1;i<n;i++)
{
int left=0,right=0;
int count=0;
int x=s1.size();
string s2;
while(right<x)
{
while(right<x&&s1[right]==s1[left])
right++;
count=right-left;
s2+=to_string(count);
s2+=s1[left];
left=right;
}
s1=s2;
}
return s1;
}
};