String Compression

김견지·2025λ…„ 4μ›” 19일

LeetCode

λͺ©λ‘ 보기
13/13
post-thumbnail

πŸ”— submission url

🧩 Problem: String Compression

LeetCode link

Description

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.

Examples

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.


My Solution

⏱ Runtime: 1 ms
🧠 Memory: 17.7 MB

Code

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)


                

        
                

Approach

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.


πŸ” Feedback

Other Solution

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

Explanation

Defined two index i, j and directly modified chars while iteration

πŸ’¬ Review & Thoughts

  • I have to get used to while more.
  • PLEASE be careful for edge cases like len(count) == 1
profile
ML Engineer / Autonomous driving

0개의 λŒ“κΈ€