String Compression Solution
String Compression Solution
Example 1:
Input: chars = ["a","a","b","b","c","c","c"]
Output: Return 6, and the first 6 characters of the input array should be:
["a","2","b","2","c","3"]
Explanation: The groups are "aa", "bb", and "ccc". This compresses to "a2b2c3".
Example 2:
Input: chars = ["a"]
Output: Return 1, and the first character of the input array should be: ["a"]
Explanation: The only group is "a", which remains uncompressed since it's a single
character.
Example 3:
Input: chars = ["a","b","b","b","b","b","b","b","b","b","b","b","b"]
Output: Return 4, and the first 4 characters of the input array should be:
["a","b","1","2"].
Explanation: The groups are "a" and "bbbbbbbbbbbb". This compresses to "ab12".
Constraints:
* 1 <= chars.length <= 2000
* chars[i] is a lowercase English letter, uppercase English letter, digit, or
symbol.
https://leetcode.com/problems/string-compression/description/
https://www.youtube.com/watch?v=IhJgguNiYYk&ab_channel=KevinNaughtonJr
- Two pointers, one goes element by element and second runs forward and counts
adjacent equal numbers
- If we have “i” and “j” as outer pointer and respectively inner pointer - when j
finished counting occurrences we will add the element at position “i” in the
result, then will need to check if the number of occurrences is greater than
1( i.e. j-i>1) which means that we need to perform compression
- We will then convert the frequency count into a string so that we can parse it
char by char from left to right and add each digit to the result
- We will then need to update I to point to J at the last line of the loop
class Solution {
public int compress(char[] chars) {
int k=0;
int i=0;
while(i<chars.length){
int j = i;
while(j<chars.length && chars[i] == chars[j]){
j++;
}
chars[k++] = chars[i];
if(j-i > 1){
String freq = (j - i) + "";
for(char c : freq.toCharArray()){
chars[k++] = c;
}
}
i = j;
}
return k;
}
}