Table of Contents
Problem Statement
The Count and Say LeetCode Solution – “Count and Say” asks you to find the nth term of the count-and-say sequence.
The count-and-say sequence is a sequence of digit strings defined by the recursive formula:
countAndSay(1) = "1"countAndSay(n)is the way you would “say” the digit string fromcountAndSay(n-1), which is then converted into a different digit string.
To find out how we’ll “say” a digit string, first split the string into a minimum number of groups of consecutive characters. Now, for each group, first, display the number of characters and then the character.
Example:
Input: n = 1
Output: "1"
Explanation:
- n = 1 is the base case of the recursion, hence answer is 1.
Input: n = "4"
Output: "1211"
Explanation:
- CountAndSay(1) = “1”.
- CountAnd Say(2) = say “1” = one time 1 = “11”.
- CountAnd Say(3) = say “11” = two times 1 = “21”.
- CountAndSay(4) = say “21” = one time 2 and one time 1 = “1211”.
Approach
Idea:
- The main idea to solve this problem is to use Recursion.
- This problem can also be solved efficiently using the iterative method, picking each time the previous string and working upon the string to get the current answer.
- Also, we need a mapping of integers to strings.
- For finding the answer to the nth sequence, consider the string obtained in the previous sequence.
- Iterate for the string and find the count of consecutive same characters and the type of character.
- Use the map to find the current answer.
Code
Count and Say Leetcode C++ Solution:
class Solution {
public:
string countAndSay(int n) {
vector<string> dp(n+1);
dp[1] = "1";
vector<string> conv = {"","1","2","3","4","5","6","7","8","9"};
for(int i=2;i<=n;i++){
int cnt = 1;
for(int j=1;j<dp[i-1].length();j++){
if(dp[i-1][j]==dp[i-1][j-1]){
cnt++;
}
else{
dp[i] += conv[cnt];
dp[i] += dp[i-1][j-1];
cnt = 1;
}
}
dp[i] += conv[cnt];
dp[i] += dp[i-1].back();
}
return dp.back();
}
};Count and Say Leetcode Java Solution:
class Solution {
public String Count(String s){
int cnt = 1;
char ch = s.charAt(0);
StringBuilder curr = new StringBuilder();
for(int i=1;i<s.length();i++){
if(s.charAt(i)==ch){
cnt++;
}
else{
curr.append(cnt);
curr.append(ch);
ch = s.charAt(i);
cnt = 1;
}
}
curr.append(cnt);
curr.append(ch);
return curr.toString();
}
public String countAndSay(int n) {
String s = "1";
for(int i=1;i<n;i++){
s = Count(s);
}
return s;
}
}Complexity Analysis for Count and Say Leetcode Solution
Time Complexity
The time complexity of the above code is O(N*L), where N = nth term in the sequence and L = max length of the string.
Since we traverse n times and each time we’ll iterate for the maximum length of string L, hence time complexity is O(N*L).
Space Complexity
The space complexity of the above code is O(N). We’re using a linear vector of size N to store all answers.
Reference: https://en.wikipedia.org/wiki/Recurrence_relation