
Given an array of characterschars, compress it using the following algorithm:Begin with an empty strings. For each group ofconsecutive repeating charactersinchars:If the group's length is1, append the character tos.Otherwise, append the character followed by the group's length.The compressed stringsshould not be returned separately, but instead, be storedin the input character arraychars. Note that group lengths that are10or longer will be split into multiple characters inchars.After you are donemodifying the input array,returnthe new length of the array.You must write an algorithm that uses only constant extra space.
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".
1 <= chars.length <= 2000
chars[i]is a lowercase English letter, uppercase English letter, digit, or symbol.
β± Runtime: 1 ms
π§ Memory: 17.7 MB
class Solution:
def compress(self, chars: List[str]) -> int:
groups = chars[0]
i = 1
count = 1
while i < len(chars):
if groups[-1] == chars[i]:
count += 1
else:
if count > 1:
groups += str(count)
groups += chars[i]
count = 1
i += 1
if count > 1:
groups += str(count) # last count
chars[:len(groups)] = list(groups)
return len(groups)
While iterating chars, if it's new, append to group and count the number of letters with count.
If different letter comes, add count and next letter to group.
Low key it was annoyingπ to fix chars directly (cause it become complicated), I ended up making another string variable group and add it to the front.
class Solution:
def compress(self, chars: List[str]) -> int:
i = j = 0
if len(chars)==1:
return 1
while i<len(chars):
count = 1
while (i<len(chars)-1 and chars[i]==chars[i+1]):
count+=1
i+=1
chars[j]=chars[i]
j+=1
if count>1:
for c in str(count):
chars[j] = c
j+=1
i+=1
return j
Defined two index i, j and directly modified chars while iteration
while more.len(count) == 1