题目描述:
The count-and-say sequence is the sequence of integers with the first five terms as following:
1. 1 2. 11 3. 21 4. 1211 5. 111221
1
is read off as
"one 1"
or
11
.11
is read off as "two 1s"
or 21
. 21
is read off as "one 2
, then one 1"
or 1211
.
Given an integer n, generate the nth term of the count-and-say sequence.
Note: Each term of the sequence of integers will be represented as a string.
例子:
Input: 1 Output: "1"
Input: 4 Output: "1211"
分析:
题意:给定一个数字字符串,初始值为"1"。这样定义一次操作:统计字符串中所有的连续重复子串的长度cnt和对应的字符c,并把"cnt"、"c"加入新的数字字符串中。返回第n次操作的结果。
思路:这是一道数学模拟题,我们采用双指针法。假设字符串的长度为len,需要得到第n次操作之后的结果。初始化指针start = 0,end = 0,分别表示一个重复子串的开始和结束位置。我们找到一个连续重复子串后,得到长度为end - start + 1,对应字符为c,则把"end - start + 1"、"c"加入新串中,并更新start = end + 1、end = start,重复上述步骤。经过完整n轮迭代之后,返回结果。
代码:
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string countAndSay(int n) {
string ans = "1";
if(n <= 1){
return ans;
}
for(int i = 1; i < n; i++){
string tmp = "";
int len = ans.length();
int start = 0, end = 0;
while((start <= end) && (end < len)){
while((end + 1 < len) && ans[end + 1] == ans[start]){
end++;
}
tmp += (to_string(end - start + 1) + ans[start]);
start = end + 1;
end = start;
}
ans = tmp;
}
return ans;
}
};