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 input 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 at least 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;
        } else {
            res += ch + "";
        }
        return res;
    }
}
