Compress string

Compress a string as follows - "aaabbbbccccc" should become "a3b4c5".  The string should be compressed only if the compressed form of the string has a smaller length than the original.
/*
 * Compress.cpp
 *
 *  Created on: Apr 10, 2012
 *      Author: Kiran Hegde
 */


#include <string>
#include <iostream>
#include <stdlib.h>
#include <string.h>

using namespace std;

unsigned int countCompress(string &str) {
    char lastFound = str[0];
    int count = 1;
    char buffer[8];
    unsigned int totalLen = 0;
    unsigned int countLen = 0;
    for (unsigned int i = 1; i < str.length(); i++) {
        if (str[i] == lastFound) {
            count++;
        } else {
            countLen = strlen(itoa(count, buffer, 10));
            lastFound = str[i];
            totalLen += (1 + countLen);
            count = 1;
        }
    }
    countLen = strlen(itoa(count, buffer, 10));
    totalLen += (1 + countLen);
    return totalLen;
}


string compress(string &str) {
    // If length of compressed string is greater than the actual string, return the actual string
    if (countCompress(str) > str.length())
        return str;

    char lastFound = str[0];
    int count = 1;
    string newStr("");
    char buffer[8];

    for (unsigned int i=1; i<str.length(); i++) {
        if (str[i] == lastFound) {
            count++;
        }
        else {
            newStr.append(1, lastFound);
            newStr.append(itoa(count, buffer, 10));
            lastFound = str[i];
            count = 1;
        }
    }
    newStr.append(1, lastFound);
    newStr.append(itoa(count, buffer, 10));
    return newStr;
}

/**
 * Test the function
 */
int main() {
    string s1 = "Hello Compression      aaaaabbbcccccdddddddddd";
    string compStr = compress(s1);
    cout << "string    : " << s1 << endl;
    cout << "compressed: " << compStr << endl;
    return 0;
}
Comments