All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g0401_0500.s0443_string_compression.Solution Maven / Gradle / Ivy

There is a newer version: 1.38
Show newest version
package g0401_0500.s0443_string_compression;

// #Medium #String #Two_Pointers #2022_07_16_Time_2_ms_(65.35%)_Space_44.8_MB_(14.78%)

/**
 * 443 - String Compression\.
 *
 * Medium
 *
 * 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 to `s`.
 * *   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 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".
 *
 * **Example 4:**
 *
 * **Input:** chars = ["a","a","a","b","b","a","a"]
 *
 * **Output:** Return 6, and the first 6 characters of the input array should be: ["a","3","b","2","a","2"].
 *
 * **Explanation:** The groups are "aaa", "bb", and "aa". This compresses to "a3b2a2". Note that each group is independent even if two groups have the same character. 
 *
 * **Constraints:**
 *
 * *   `1 <= chars.length <= 2000`
 * *   `chars[i]` is a lowercase English letter, uppercase English letter, digit, or symbol.
**/
public class Solution {
    /* This is breaking the rules, it's not in-place. */
    public int compress(char[] chars) {
        if (chars == null || chars.length == 0) {
            return 0;
        }
        StringBuilder sb = new StringBuilder();
        int count = 1;
        char prev = chars[0];
        for (int i = 1; i < chars.length; i++) {
            if (chars[i] == prev) {
                count++;
            } else {
                if (count > 1) {
                    sb.append(prev);
                    sb.append(count);
                } else if (count == 1) {
                    sb.append(prev);
                }
                prev = chars[i];
                count = 1;
            }
        }
        sb.append(prev);
        if (count > 1) {
            sb.append(count);
        }
        int i = 0;
        for (char c : sb.toString().toCharArray()) {
            chars[i++] = c;
        }
        return sb.length();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy