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.
Follow up:Could you solve it using only O(1)
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 lower-case English letter, upper-case English letter, digit, or symbol.
같은 숫자를 세는 아이디어는 간단했다. consecutive repeating character 를 세는 것이기 때문에 정렬이 된 것으로 간주할 수 있다. 때문에 바로 앞과 뒤 숫자를 비교하는 것만으로 숫자를 세는 것이 가능하다.
import java.util.ArrayList;
import java.util.List;
public class StringCompression {
public int compress(char[] chars) {
List<Pair> pairList = new ArrayList<>();
pairList.add(new Pair(chars[0], 1));
for (int i = 1; i < chars.length; i++) {
if (chars[i-1] != chars[i]) {
pairList.add(new Pair(chars[i], 1));
} else {
pairList.get(pairList.size()-1).cnt += 1;
}
}
int i = 0;
for (Pair pair : pairList) {
chars[i++] = pair.c;
int cnt = pair.cnt;
if (cnt > 1)
for (int j = 0; j < String.valueOf(cnt).length(); j++)
chars[i++] = String.valueOf(cnt).charAt(j);
}
return i;
}
static class Pair {
char c;
int cnt;
public Pair(char c, int cnt) {
this.c = c;
this.cnt = cnt;
}
}
}
'Algorithm' 카테고리의 다른 글
134. Gas Station (0) | 2021.01.24 |
---|---|
3. Longest Substring Without Repeating Characters (0) | 2021.01.14 |
[Leetcode] 1197. Minimum Knight Moves (0) | 2020.12.26 |
1283. Find the Smallest Divisor Given a Threshold (0) | 2020.12.26 |
[Leetcode] 1396. Design Underground System (0) | 2020.12.22 |