Cracking the Coding Interview 5.


原题描述

利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3,若压缩后的字符串没有变短,则返回原字符串。

算法

Ideas:

  1. 计算压缩后的长度newLen
  2. 利用newLen开辟数组
  3. 遍历找到重复字符,并更新新数组

Algo:

  • 主压缩函数:

    1. 获取压缩后长度,并判断,若≥原串长度,则返回原串。
    2. 利用新长度定义压缩串的存储数组array
    3. 定义中间变量index(指示压缩串的遍历位置),last和count用于遍历重复字符
    4. 遍历原串 i
    	若str[i] == last时,则count++计数
    	否则:
    		利用index,last,count对array进行赋值,并返回新的index,并更新
    		重置last,count
    5. 以最后一组重复字符的index,last,count更新array,返回array
    
  • 压缩串长度计算函数

    1. 异常判断(对象为空或者字符串为空串),则返回0
    2. 定义用于遍历的last,count和用于计算长度的size=0
    3. 遍历原串 i
    	若str[i] == last时,则count++计数
    	否则:
    		size += (1 + count对应串的长度)
    		重置last,count
    4. 以最后一组重复字符的count更新size
    5. 返回size
    
  • 设置新串函数(array,index,last, count)

    1. 把last赋到array的[index]处,index++
    2. 把count转化成串
    3. 遍历该串 i
    	把串[i] 复制到 array[index]处,index++
    4. 返回index
    

C++代码

#include<iostream>
#include<sstream>

using namespace std;

int countCompression(string str) {
  if (str.empty()) {
    return 0;
  }

  int count = 1;
  char last = str[0];
  int size = 0;

  for (int i = 1; i < str.length(); i++) {
    if (str[i] == last) {
      count++;
    }
    else {
      stringstream ss;
      ss << count;
      string tp = ss.str();
      size += (1 + tp.length());
      last = str[i];
      count = 1;
    }
  }

  stringstream ss;
  ss << count;
  string tp = ss.str();
  size += (1 + tp.length());

  return size;
}

int setArray(char *array, int index, char last, int count) {
  array[index++] = last;

  stringstream ss;
  ss << count;
  string tp = ss.str();

  for (int i = 0; i < tp.length(); i++) {
    array[index++] = tp[i];
  }

  return index;
}

string stringCompression(string str) {
  int size = countCompression(str);
  if (size >= str.length()) {
    return str;
  }

  char *array = new char[size];
  char last = str[0];
  int count = 1;
  int index = 0;

  for (int i = 1; i < str.length(); i++) {
    if (str[i] == last) {
      count++;
    }
    else {
      index = setArray(array, index, last, count);
      last = str[i];
      count = 1;
    }
  }

  setArray(array, index, last, count);
  string ret = string(array);
  delete[] array;

  return ret;
}

int main() {
  string input;
  cin >> input;
  string output = stringCompression(input);
  cout << output << endl;
  return 0;
}

Bug Free Procedure



本作品由 Marvin.Cao 创作,采用 CC BY-NC-SA 3.0 许可协议 进行许可。

Comments