mirror of
https://github.com/TheAlgorithms/Java.git
synced 2025-07-07 01:35:16 +08:00
@ -0,0 +1,60 @@
|
||||
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 class 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;
|
||||
}
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
package com.thealgorithms.strings;
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.CsvSource;
|
||||
|
||||
public class StringCompressionTest {
|
||||
@ParameterizedTest
|
||||
@CsvSource({"a,a","aabbb,a2b3","abbbc,ab3c","aabccd,a2bc2d"})
|
||||
void stringCompressionTest(String input,String expectedOutput){
|
||||
String output=StringCompression.compress(input);
|
||||
assertEquals(expectedOutput, output);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user