Table of Contents
Problem Statement
String Compression LeetCode Solution – Given an array of characters chars
, compress it using the following algorithm:
Begin with an empty string s
. For each group of consecutive repeating characters in chars
:
- If the group’s length is
1
, append the character tos
. - Otherwise, append the character followed by the group’s length.
The compressed string s
should not be returned separately, but instead, be stored in the input character array chars
. Note that group lengths that are 10
or longer will be split into multiple characters in chars
.
After you are done modifying the input array, return the new length of the array.
You must write an algorithm that uses only constant extra space.
Example
Test Case 1:
Input:
chars = [“a”, “a”, “b”, “b”, “c”, “c”, “c”]
Output:
6
Test Case 2:
Input:
chars = [“a”, “b”, “b”, “b”, “b”, “b”, “b”, “b”, “b”, “b”, “b”, “b”, “b”]
Output:
4
Explanation
i) The groups are “aa”, “bb”, “ccc”. It compresses to “a2b2c3”. The array basically is [“a”, “2”, “b”, “2”, “c”, “3”].
ii) The groups are “a”, “bbbbbbbbbbbb”. It compresses to “ab12”.
Approach:
So here I am going to explain algo. Firstly we are going to take a example “aabbccc“. so in this example firstly we will append a into a string or stringbuilder then we will make its count 1 as one of one is there now we will move to for loop . In for loop we are using two pointers one is current and another is prev prev stores previous character and current stores current character now as:-
we are iterating from 1 as the 1st charcter is already in string buildernow iterating
1->prev = a , curr = a so count will be 2 . s = a
2->prev = a , curr = b so we will not increase rather will go to else part where we will check if count>1 then we will append it and will also append the char . and reset the count to 1 . a2->a2b
3->prev=b, curr =b count = 2 s=a2b
4->prev= b , curr = c count = 2 so will go in else part as prev!=curr count > 2 so s= a2b2-> a2b2c count =1
5->prev = c ,curr = c count =2 s =a2b2c
6->prev = c , curr = c count =3 s =a2b2c
Now here iteration will stop and our count is still remaining so at last outside the loop we will add the count if >1so string will be a2b2c3.
So the string is compressed now we will copy it to char array. and return its length.
Code for String Compression
Java Program
class Solution { public int compress(char[] chars) { StringBuilder sb = new StringBuilder(); int n = chars.length; int count = 1; sb.append(chars[0]); for(int i=1;i<n;i++) { char curr = chars[i]; char prev = chars[i-1]; if(prev==curr) { count++; } if(prev!=curr) { if(count>1) sb.append(count); sb.append(curr); count = 1; } } if(count>1) { sb.append(count); } for(int i=0;i<sb.length();i++) { chars[i]=sb.charAt(i); } return sb.length(); } }
C++ Program
class Solution { public: int compress(vector<char>& chars) { int nw_idx = 0; // Next write index int nr_idx = 1; // Next read index int cnt = 1; // Running counter char prev_char = chars[0]; // Running previous character chars.push_back('\0'); // To make the code shorter (no special handling of last char) // Code below is more or less self explanatory while(nr_idx != chars.size()) { if(chars[nr_idx] != prev_char) { chars[nw_idx++] = prev_char; if(cnt > 1) { string cnt_str = to_string(cnt); for(char c : cnt_str) chars[nw_idx++] = c; cnt = 1; } } else { cnt++; } prev_char = chars[nr_idx++]; } return nw_idx; } };
Complexity Analysis for String Compression LeetCode Solution
Time Complexity will be
Space Complexity will be
Reference: https://algodaily.com/lessons/using-the-two-pointer-technique