g0401_0500.s0443_string_compression.Solution Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of leetcode-in-java21 Show documentation
Show all versions of leetcode-in-java21 Show documentation
Java-based LeetCode algorithm problem solutions, regularly updated
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