38、Count and Say
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"
or11
.11
is read off as"two 1s"
or21
.21
is read off as"one 2
, thenone 1"
or1211
.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.
Example 1:
Input: 1 Output: "1"Example 2:
Input: 4 Output: "1211"
C+
class Solution { public: string countAndSay(int n) { if (n == 0) return ""; string res = "1"; while (--n) { string cur = ""; for (int i = 0; i < res.size(); i++) { int count = 1; while ((i + 1 < res.size()) && (res[i] == res[i + 1])){ count++; i++; } cur += to_string(count) + res[i]; } res = cur; } return res; } };
python
Solution 1 ... using a regular expression def countAndSay(self, n): s = '1' for _ in range(n - 1): s = re.sub(r'(.)1*', lambda m: str(len(m.group(0))) + m.group(1), s) return s
Solution 2 ... using a regular expression def countAndSay(self, n): s = '1' for _ in range(n - 1): s = ''.join(str(len(group)) + digit for group, digit in re.findall(r'((.)2*)', s)) return s
Solution 3 ... using groupby def countAndSay(self, n): s = '1' for _ in range(n - 1): s = ''.join(str(len(list(group))) + digit for digit, group in itertools.groupby(s)) return s