Count and Say (LeetCode)
Problem Descriptionβ
Problem Statement | Solution Link | LeetCode Profile |
---|---|---|
Merge Two Sorted Lists | Merge Two Sorted Lists Solution on LeetCode | VijayShankerSharma |
Problem Descriptionβ
The count-and-say sequence is a sequence of digit strings defined by the recursive formula:
- countAndSay(1) = "1"
- countAndSay(n) is the run-length encoding of countAndSay(n - 1).
Run-length encoding (RLE) is a string compression method that works by replacing consecutive identical characters (repeated 2 or more times) with the concatenation of the character and the number marking the count of the characters (length of the run). For example, to compress the string "3322251" we replace "33" with "23", replace "222" with "32", replace "5" with "15" and replace "1" with "11". Thus the compressed string becomes "23321511".
Given a positive integer n, return the nth element of the count-and-say sequence.
Examplesβ
Example 1β
- Input: n = 4
- Output: "1211"
- Explanation:
- countAndSay(1) = "1"
- countAndSay(2) = RLE of "1" = "11"
- countAndSay(3) = RLE of "11" = "21"
- countAndSay(4) = RLE of "21" = "1211"
Example 2β
- Input: n = 1
- Output: "1"
- Explanation: This is the base case.
Constraintsβ
1 <= n <= 30
Approachβ
To solve this problem, we can use a recursive approach. Here's how the algorithm works:
- Initialize a base case where if n equals 1, return "1".
- For any value of n greater than 1, recursively call the function countAndSay(n-1).
- Convert the result of countAndSay(n-1) into the count-and-say format.
Solution Codeβ
Pythonβ
class Solution(object):
def countAndSay(self, n):
if n == 1:
return "1"
prev = self.countAndSay(n - 1)
result = ""
count = 1
for i in range(len(prev)):
if i + 1 < len(prev) and prev[i] == prev[i + 1]:
count += 1
else:
result += str(count) + prev[i]
count = 1
return result
C++β
class Solution {
public:
string countAndSay(int n) {
if (n == 1)
return "1";
string prev = countAndSay(n - 1);
string result = "";
int count = 1;
for (int i = 0; i < prev.length(); ++i) {
if (i + 1 < prev.length() && prev[i] == prev[i + 1]) {
count++;
} else {
result += to_string(count) + prev[i];
count = 1;
}
}
return result;
}
};
Javaβ
class Solution {
public String countAndSay(int n) {
if (n == 1)
return "1";
String prev = countAndSay(n - 1);
StringBuilder result = new StringBuilder();
int count = 1;
for (int i = 0; i < prev.length(); ++i) {
if (i + 1 < prev.length() && prev.charAt(i) == prev.charAt(i + 1)) {
count++;
} else {
result.append(count).append(prev.charAt(i));
count = 1;
}
}
return result.toString();
}
}
Conclusionβ
The count-and-say sequence is generated based on the previous sequence using run-length encoding. This problem can be efficiently solved using a recursive approach where each step generates the next sequence based on the previous one. The provided solution code effectively implements this recursive algorithm to generate the nth element of the count-and-say sequence.