public static void Main()
Console.WriteLine(CompressStringNaiveApproach("Straightforward:"));
Console.WriteLine(CompressStringNaiveApproach("aaabccccdd"));
Console.WriteLine(CompressStringNaiveApproach("yyyyyzzzzzzzzzz"));
Console.WriteLine(CompressStringNaiveApproach("abcd"));
Console.WriteLine(CompressStringNaiveApproach("hhhccchhhccc"));
Console.WriteLine(CompressStringNaiveApproach("Optimize space complexity:"));
Console.WriteLine(CompressStringOptimizeSpaceComplexity(new StringBuilder("aaabccccdd")));
Console.WriteLine(CompressStringOptimizeSpaceComplexity(new StringBuilder("yyyyyzzzzzzzzzz")));
Console.WriteLine(CompressStringOptimizeSpaceComplexity(new StringBuilder("abcd")));
Console.WriteLine(CompressStringOptimizeSpaceComplexity(new StringBuilder("hhhccchhhccc")));
private static string CompressStringNaiveApproach(string originalString)
if (string.IsNullOrEmpty(originalString) || originalString.Length == 1)
var resultBuilder = new StringBuilder(originalString.Length);
var currentCharFrequency = 1;
for (int i = 0; i < originalString.Length; i++)
if( i>0 && originalString[i] == originalString[i-1])
if(i == originalString.Length-1)
resultBuilder.Append(currentCharFrequency);
if (currentCharFrequency > 1)
resultBuilder.Append(currentCharFrequency);
currentCharFrequency = 1;
resultBuilder.Append(originalString[i]);
return resultBuilder.ToString();
private static string CompressStringOptimizeSpaceComplexity(StringBuilder originalString)
if (originalString == null)
if (originalString.Length < 2)
return originalString.ToString();
while (fast <= originalString.Length)
if (fast != originalString.Length && originalString[fast] == originalString[slow])
int repeatCount = fast - slow;
originalString[last++] = originalString[slow];
var repeatCountChars = repeatCount.ToString().ToCharArray();
foreach (char c in repeatCountChars)
originalString[last] = c;
return originalString.Remove(last, originalString.Length-last).ToString();