--- tags: data_structure_python --- # Count and Say <img src="https://img.shields.io/badge/-easy-brightgreen"> 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. <ins>**Example 1:**</ins> >Input: 1 >Output: "1" >Explanation: This is the base case. <ins>**Example 2:**</ins> >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". ## Solution ```python= class Solution: def __countAndSay(self, n, prev): if n == 1: return "1" prev = self.__countAndSay(n-1, prev) res, tmp, frequency = "", prev[0], 0 for i in range(len(prev)): # Count. if prev[i] == tmp: frequency += 1 else: res = res + str(frequency) + prev[i-1] frequency = 1 tmp = prev[i] # Say. if i == len(prev)-1: res = res + str(frequency) + prev[i] return res def countAndSay(self, n: int) -> str: return self.__countAndSay(n, "") ```