Intuition

We will use separate pointers read and write to mark where we are reading and writing from. Both operations will be done left to right alternately: we will read a contiguous group of characters, then write the compressed version to the array. At the end, the position of the write head will be the length of the answer that was written.

Algorithm

Let's maintain anchor, the start position of the contiguous group of characters we are currently reading.

Now, let's read from left to right. We know that we must be at the end of the block when we are at the last character, or when the next character is different from the current character.

When we are at the end of a group, we will write the result of that group down using our write head. chars[anchor] will be the correct character, and the length (if greater than 1) will be read - anchor + 1. We will write the digits of that number to the array.

Python

class Solution(object):
def compress(self, chars):
anchor = write = 0
if read + 1 == len(chars) or chars[read + 1] != c:
chars[write] = chars[anchor]
write += 1
for digit in str(read - anchor + 1):
chars[write] = digit
write += 1
return write


Java

class Solution {
public int compress(char[] chars) {
int anchor = 0, write = 0;
chars[write++] = chars[anchor];
for (char c: ("" + (read - anchor + 1)).toCharArray()) {
chars[write++] = c;
}
}
}
}
return write;
}
}


Complexity Analysis

• Time Complexity: , where is the length of chars.

• Space Complexity: , the space used by read, write, and anchor.

Analysis written by: @awice.