import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RunLengthEncoding {
public String encode(String data) {
StringBuilder encodedDataBuilder = new StringBuilder();
if (data.length() == 0) {
return data;
}
int previousCharCount = 1;
char previousChar = data.charAt(0);
for (int i = 1; i < data.length(); i++) {
char currentChar = data.charAt(i);
if (previousChar == currentChar) {
previousCharCount++;
}
if (previousChar != currentChar || i == data.length() - 1) {
addChars(encodedDataBuilder, previousChar, previousCharCount);
if (previousChar != currentChar && i == data.length() - 1) {
addChars(encodedDataBuilder, currentChar, 1);
}
previousChar = currentChar;
previousCharCount = 1;
}
}
return encodedDataBuilder.toString();
}
public void addChars(StringBuilder toAddTo, char toAdd, int countOfChar) {
if(countOfChar != 1) {
toAddTo.append(countOfChar);
}
toAddTo.append(toAdd);
}
public String decode(String encodedData) {
StringBuilder decodedData = new StringBuilder();
Pattern pattern = Pattern.compile("[0-9]+|[a-zA-Z\\s]");
Matcher matcher = pattern.matcher(encodedData);
while (matcher.find()) {
try {
int number = Integer.parseInt(matcher.group());
matcher.find();
for (int i = 0; i<number; i++) {
decodedData.append(matcher.group());
}
} catch (NumberFormatException e) {
decodedData.append(matcher.group());
}
}
return decodedData.toString();
}
}