博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[CareerCup] 1.5 Compress String 压缩字符串
阅读量:6715 次
发布时间:2019-06-25

本文共 2497 字,大约阅读时间需要 8 分钟。

1.5 Implement a method to perform basic string compression using the counts of repeated characters. For example, the string aabcccccaaa would become a2blc5a3. If the "compressed" string would not become smaller than the original string, your method should return the original string.

这道题让我们压缩给定的字符串,压缩方法是对于重复的字符,用数字来表示重复的个数,这种压缩方法对于有很多重复字符具有很高的压缩效率,但是对于不重复的字符串,压缩后的表示方法反而比不压缩占空间大。所以我们首先要先来计算下压缩后的字符串的长度,和原字符串长度比较,如果大的话,则直接返回原字符串,如果小的话,则我们就开始压缩。那么我们需要建立一个新字符串来保存压缩后的字符串,这里书中特别提到了用字符串的相加的方法是很没有效率的,下面英文部分摘自Cracking the coding interview 5th edition的第72页:

Imagine you were concatenating a list of strings, as shown below. What would the running time of this code be? For simplicity, assume that the strings are all the same length (call this x) and that there are n strings.

public String joinWords(String[] words) {    String sentence = "";    for (String w : words) {        sentence = sentence + w;    }    return sentence;}

On each concatenation, a new copy of the string is created, and the two strings are copied over, character by character. The first iteration requires us to copy x characters. The second iteration requires copying 2x characters.The third iteration requires 3x, and

so on.The total time therefore is 0(x + 2x + ... + nx). This reduces to 0(xn2). (Why isn't it 0(xnn)? Because 1 + 2 + ... + nequals n(n+l)/2,orO(n2).)

根据上面所说,字符串的拼接余姚拷贝拼接的两个字符串,当字符串长度很长的时候,这种方法非常没有效率,所以我们要避免使用拼接的方法。那么我们的替代方法是先声明好一个定长的字符串,然后给每个位置赋值。压缩后的字符串长度我们开始计算过了,所以只需要给每个位置赋值即可,跟之前那道有些相似,参见代码如下:

class Solution {public:    string compress(string s) {        int newLen = countCompression(s);        if (newLen >= s.size()) return s;string res(newLen, ' ');        char c = s[0];        int cnt = 1, idx = 0;        for (int i = 1; i < s.size(); ++i) {            if (s[i] == c) ++cnt;            else {                res[idx++] = c;                for (auto a : to_string(cnt)) res[idx++] = a;                c = s[i];                cnt = 1;            }        }        res[idx++] = c;        for (auto a : to_string(cnt)) res[idx++] = a;        return res;    }    int countCompression(string s) {        if (s.empty()) return 0;        int res = 0, cnt = 1;        char c = s[0];        for (int i = 1; i < s.size(); ++i) {            if (s[i] == c) ++cnt;            else {                c = s[i];                res += 1 + to_string(cnt).size();                cnt = 1;            }        }        res += 1 + to_string(cnt).size();        return res;    }};

本文转自博客园Grandyang的博客,原文链接:,如需转载请自行联系原博主。

你可能感兴趣的文章
jstack和线程dump分析
查看>>
NETSH WINSOCK RESET这条命令的含义和作用?
查看>>
SQL批量更新数据库中所有用户数据表中字段类型为tinyint为int
查看>>
第一次使用Android Studio时你应该知道的一切配置(二):新建一个属于自己的工程并安装Genymotion模拟器...
查看>>
AtomicInteger简介
查看>>
(转)解决ScrollView嵌套ListView或者GridView导致只显示一行的方法
查看>>
html5 -- audio标签
查看>>
DNG格式解析
查看>>
Windows 下搭建LDAP服务器
查看>>
2015年第8本(英文第7本):the city of ember 微光城市
查看>>
FZU操作系统课程实验 实验一
查看>>
【转】Android Activity和Intent机制学习笔记----不错
查看>>
Eclipse背景颜色修改
查看>>
linux下安装oracle11g 64位最简客户端(转)
查看>>
搭建XMPP协议,实现自主推送消息到手机
查看>>
基于FPGA的图像处理(二)--System Generator入门
查看>>
DIV+CSS 入门
查看>>
UVa 213 Message Decoding(World Finals1991,串)
查看>>
Everything search syntax
查看>>
BZOJ 3211 弗洛拉前往国家 树阵+并检查集合
查看>>