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 where 1 ≤ n ≤ 30, generate the nth term of the count-and-say sequence. You can do so recursively, in other words from the previous member read off the digits, counting the number of digits in groups of the same digit.
Note: Each term of the sequence of integers will be represented as a string.
Example 1:
Input: 1 Output: "1" Explanation: This is the base case.
Example 2:
Input: 4 Output: "1211" Explanation: For n = 3 the term was "21" in which we have two groups "2" and "1", "2" can be read as "12" which means frequency = 1 and value = 2, the same way "1" is read as "11", so the answer is the concatenation of "12" and "11" which is "1211".
这题目英文描述真是醉了,看半天没理解意思,还是看网上翻译的。其实就是后一个字符串是前一个字符串的read,比如第三个字符串是21,它包含1个2和1个1,所以第四个字符串就是1211。 果然是easy模式,用递归几行代码搞定。
class Solution {
public:
string countAndSay(int n)
{
if (n == 1)
return "1";
string pre = countAndSay(n – 1);
string ans = "";
int i = 0, j;
while (i < pre.size()) {
j = i + 1;
while (j < pre.size() && pre[j] == pre[i])
j++;
ans += to_string(j – i) + pre.substr(i, 1);
i = j;
}
return ans;
}
};
本代码提交AC,用时4MS。