package com.thealgorithms.strings; /* References : https://en.wikipedia.org/wiki/Run-length_encoding * String compression algorithm deals with encoding the string, that is, shortening the size of the * string * @author Swarga-codes (https://github.com/Swarga-codes) */ public final class StringCompression { private StringCompression() { } /** * Returns the compressed or encoded string * * @param ch character array that contains the group of characters to be encoded * @return the compressed character array as string */ public static String compress(String input) { // Keeping the count as 1 since every element present will have atleast a count // of 1 int count = 1; String compressedString = ""; // Base condition to check whether the array is of size 1, if it is then we // return the array if (input.length() == 1) { return "" + input.charAt(0); } // If the array has a length greater than 1 we move into this loop for (int i = 0; i < input.length() - 1; i++) { // here we check for similarity of the adjacent elements and change the count // accordingly if (input.charAt(i) == input.charAt(i + 1)) { count = count + 1; } if ((i + 1) == input.length() - 1 && input.charAt(i + 1) == input.charAt(i)) { compressedString = appendCount(compressedString, count, input.charAt(i)); break; } else if (input.charAt(i) != input.charAt(i + 1)) { if ((i + 1) == input.length() - 1) { compressedString = appendCount(compressedString, count, input.charAt(i)) + input.charAt(i + 1); break; } else { compressedString = appendCount(compressedString, count, input.charAt(i)); count = 1; } } } return compressedString; } /** * @param res the resulting string * @param count current count * @param ch the character at a particular index * @return the res string appended with the count */ public static String appendCount(String res, int count, char ch) { if (count > 1) { res += ch + "" + count; count = 1; } else { res += ch + ""; } return res; } }