Skip to main content

String Compression: "String Compression III" Problem | Leetcode 3163 | Medium | String

String manipulation is a common task in programming, especially when it comes to optimizing data storage or transmission. One fascinating challenge is the "String Compression III" problem from LeetCode, which requires you to compress a string according to specific rules. In this post, we’ll explore the problem statement, discuss a practical solution, and delve into the intricacies of the algorithm. Whether you’re preparing for coding interviews or simply want to enhance your problem-solving skills, this guide will provide valuable insights.

Problem Statement

You are given a string called word, and your task is to compress it using a specific algorithm. The rules for compression are as follows:

  1. Begin with an empty string comp.
  2. While word is not empty, remove a maximum length prefix made of a single character c, which can repeat at most 9 times.
  3. Append the length of the prefix followed by the character c to comp.
  4. Continue this process until all characters in word are processed.

Examples

Let’s look at a couple of examples to clarify the requirements:

  • Example 1:

    • Input: word = "abcde"
    • Output: "1a1b1c1d1e"
    • Explanation: Each character appears only once, so the output reflects this straightforwardly.
  • Example 2:

    • Input: word = "aaaaaaaaaaaaaabb"
    • Output: "9a5a2b"
    • Explanation: Here, the string has a long sequence of 'a's, which can be compressed to '9a' for the first nine, followed by '5a' for the next five, and '2b' for the last two 'b's.

Constraints

  • The length of word is between 1 and 200,000 characters.
  • The string consists only of lowercase English letters.

Designing the Solution

To solve the problem effectively, we can adopt an iterative approach. We will traverse the string, counting occurrences of each character until we hit a different character or reach the limit of 9 repetitions. Let’s break down the steps involved in the solution.

Step-by-Step Approach

  1. Initialize Variables: Start with the first character and initialize a count for its occurrences.
  2. Iterate Through the String: For each character:
    • If it matches the current character, increase the count (up to 9).
    • If it changes, append the count and the character to the result string and reset the count.
  3. Final Append: After the loop, don’t forget to append the count and character for the last group.
  4. Return Result: Finally, return the compressed string.


Implementation

Here’s a C++ implementation based on the approach we just discussed:

class Solution {
public:
    string compressedString(string word)
    {
        char ch = word[0]; // Start with the first character
        int count = 1; // Initialize count for the first character
        string ans = ""; // Result string for compressed output

        for(int i = 1; i < word.length(); i++)
        {
            if(word[i] == ch) // Check if current character matches the previous
            {
                if(count < 9)
                    count++; // Increase count, not exceeding 9
                else
                {
                    ans += char(count + '0'); // Append count
                    ans += ch; // Append character
                    count = 1; // Reset count for the next character
                }
            }
            else // When character changes
            {
                ans += char(count + '0'); // Append previous count
                ans += ch; // Append previous character
                ch = word[i]; // Update character to the new one
                count = 1; // Reset count for the new character
            }
        }
        // Append the last counted character
        ans += char(count + '0');
        ans += ch;
        return ans; // Return the compressed string
    }
};

Explanation of the Code

  • Variable Initialization: We begin with the first character and a count set to 1. The result string ans is initialized as empty.
  • Main Loop: We loop through the string starting from the second character, checking for matches with the current character.
  • Count Handling: We ensure the count does not exceed 9, appending to the result string when it changes.
  • Finalizing the Result: After exiting the loop, we must remember to append the last counted character.

Complexity Analysis

  • Time Complexity: The algorithm runs in O(n), where n is the length of the string. Each character is processed exactly once.
  • Space Complexity: The space complexity is O(n) in the worst case due to the storage of the output string, but this is efficient given the nature of the problem.

The "String Compression III" problem is an excellent exercise in string manipulation and algorithmic thinking. By following a systematic approach, we can efficiently compress a string while adhering to the specified rules. This problem not only sharpens our coding skills but also enhances our understanding of data structures and algorithms.

Whether you’re tackling similar problems or preparing for technical interviews, mastering string manipulation techniques like these will serve you well in your programming journey.

Popular posts from this blog

Top 10 Beginner-Friendly LeetCode Questions and Their Solutions

If you're new to solving coding problems on LeetCode, it can feel overwhelming. Where do you start? Which problems are suitable for beginners? Don’t worry! In this blog post, I’ll guide you through 10 beginner-friendly LeetCode questions that are perfect for getting started on your coding journey. These problems will help you build confidence, improve your problem-solving skills, and lay a solid foundation in data structures and algorithms. Why Start with Beginner-Friendly Problems? Before diving into advanced topics like dynamic programming or graph theory, it’s essential to: Build a strong foundation in basic programming concepts. Understand how to approach a coding problem methodically. Gain familiarity with LeetCode’s platform and its problem structure. The following problems are simple yet impactful, designed to introduce you to common techniques like loops, arrays, strings, and basic math operations. 10 Beginner-Friendly LeetCode Problems 1. Two Sum (Easy) Problem Link : Two...

LeetCode 2583: Kth Largest Sum in a Binary Tree – Solution Explained

When working with binary trees, one common task is to analyze the properties of the tree's levels. In this blog post, we'll walk through a solution to LeetCode Problem 2583: Kth Largest Sum in a Binary Tree , a problem that challenges us to compute and find specific sums from different levels of a binary tree. Problem Statement You are given the root of a binary tree and a positive integer k . Your goal is to return the k-th largest level sum in the tree. The level sum is defined as the sum of the values of all nodes at the same depth in the tree. If the number of levels in the tree is less than k , the function should return -1 . Example 1: Input: root = [5, 8, 9, 2, 1, 3, 7, 4, 6] , k = 2 Output: 13 Explanation: Level 1 sum: 5 Level 2 sum: 8 + 9 = 17 Level 3 sum: 2 + 1 + 3 + 7 = 13 Level 4 sum: 4 + 6 = 10 The 2nd largest sum is 13 . Example 2: Input: root = [1, 2, null, 3] , k = 1 Output: 3 Explanation: The largest level sum is 3 (at the third level). This problem essentia...

LeetCode 3370: Smallest Number With All Set Bits – Problem Explanation and Solutions

Are you looking to master bit manipulation and tackle interesting coding challenges? In this post, we’ll explore LeetCode Problem 3370: Smallest Number With All Set Bits . We’ll dive deep into the problem statement, break down a brute force approach, and finally discuss an optimized solution. If you’re preparing for technical interviews or just love solving algorithmic problems, this guide is for you! Problem Statement: Smallest Number With All Set Bits You are given a positive integer n . Your task is to find the smallest number x such that: x is greater than or equal to n . The binary representation of x consists only of set bits ( 1 s). Examples: Example 1: Input: n = 5 Output: 7 Explanation: The binary representation of 7 is 111 , which is the smallest number greater than or equal to 5 with all bits set. Example 2: Input: n = 10 Output: 15 Explanation: The binary representation of 15 is 1111 . Example 3: Input: n = 3 Output: 3 Explanation: The binary representation of 3 is...