[runLength-en-decoding] run length encoding (#15735)
This commit is contained in:
parent
d3ed1933ee
commit
b490028e69
@ -0,0 +1,93 @@
|
|||||||
|
package com.baeldung.string.runlength;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
public class RunLengthEncodingUnitTest {
|
||||||
|
private static final String INPUT = "WWWWWWWWWWWWBAAACCDEEEEE";
|
||||||
|
private static final String RLE = "12W1B3A2C1D5E";
|
||||||
|
|
||||||
|
String runLengthEncode(String input) {
|
||||||
|
StringBuilder result = new StringBuilder();
|
||||||
|
int count = 1;
|
||||||
|
char[] chars = input.toCharArray();
|
||||||
|
for (int i = 0; i < chars.length; i++) {
|
||||||
|
char c = chars[i];
|
||||||
|
if (i + 1 < chars.length && c == chars[i + 1]) {
|
||||||
|
count++;
|
||||||
|
} else {
|
||||||
|
result.append(count).append(c);
|
||||||
|
count = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
String runLengthDecode(String rle) {
|
||||||
|
StringBuilder result = new StringBuilder();
|
||||||
|
char[] chars = rle.toCharArray();
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
for (char c : chars) {
|
||||||
|
if (Character.isDigit(c)) {
|
||||||
|
count = 10 * count + Character.getNumericValue(c);
|
||||||
|
} else {
|
||||||
|
result.append(String.join("", Collections.nCopies(count, String.valueOf(c))));
|
||||||
|
count = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
String runLengthEncodeByRegEx(String input) {
|
||||||
|
String[] arr = input.split("(?<=(\\D))(?!\\1)");
|
||||||
|
StringBuilder result = new StringBuilder();
|
||||||
|
for (String run : arr) {
|
||||||
|
result.append(run.length()).append(run.charAt(0));
|
||||||
|
}
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
String runLengthDecodeByRegEx(String rle) {
|
||||||
|
if (rle.isEmpty()) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
String[] arr = rle.split("(?<=\\D)|(?=\\D+)");
|
||||||
|
if (arr.length % 2 != 0) {
|
||||||
|
throw new IllegalArgumentException("Not a RLE string");
|
||||||
|
}
|
||||||
|
StringBuilder result = new StringBuilder();
|
||||||
|
|
||||||
|
for (int i = 1; i <= arr.length; i += 2) {
|
||||||
|
int count = Integer.parseInt(arr[i - 1]);
|
||||||
|
String c = arr[i];
|
||||||
|
|
||||||
|
result.append(String.join("", Collections.nCopies(count, c)));
|
||||||
|
}
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void whenInvokingRunLengthEncode_thenGetExpectedResult() {
|
||||||
|
assertEquals(RLE, runLengthEncode(INPUT));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void whenInvokingRunLengthDecode_thenGetExpectedResult() {
|
||||||
|
assertEquals(INPUT, runLengthDecode(RLE));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void whenInvokingRunLengthEncodeByRegEx_thenGetExpectedResult() {
|
||||||
|
assertEquals(RLE, runLengthEncodeByRegEx(INPUT));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void whenInvokingRunLengthDecodeByRegEx_thenGetExpectedResult() {
|
||||||
|
assertEquals(INPUT, runLengthDecodeByRegEx(RLE));
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user