Given an array of characters, compress it in-place.

The length after compression must always be smaller than or equal to the original array.

Every element of the array should be a character (not int) of length 1.

After you are done modifying the input array in-place, return the new length of the array.

Follow up:
Could you solve it using only O(1) extra space?

Example 1:

Input:
["a","a","b","b","c","c","c"] Output:
Return 6, and the first 6 characters of the input array should be: ["a","2","b","2","c","3"] Explanation:
"aa" is replaced by "a2". "bb" is replaced by "b2". "ccc" is replaced by "c3".

Example 2:

Input:
["a"] Output:
Return 1, and the first 1 characters of the input array should be: ["a"] Explanation:
Nothing is replaced.

Example 3:

Input:
["a","b","b","b","b","b","b","b","b","b","b","b","b"] Output:
Return 4, and the first 4 characters of the input array should be: ["a","b","1","2"]. Explanation:
Since the character "a" does not repeat, it is not compressed. "bbbbbbbbbbbb" is replaced by "b12".
Notice each digit has it's own entry in the array.

Note:

  1. All characters have an ASCII value in [35, 126].
  2. 1 <= len(chars) <= 1000.

这道题给了我们一个字符串,让我们进行压缩,即相同的字符统计出个数,显示在该字符之后,根据例子分析不难理解题意。这道题要求我们进行in place操作,即不使用额外空间,最后让我们返回修改后的新数组的长度。我们首先想,数组的字符不一定是有序的,如果我们用Map来建立字符和出现次数之间的映射,不管是用HashMap还是TreeMap,一定无法保证原有的顺序。所以不能用Map,而我们有需要统计个数,那么双指针就是不二之选啦。既然双指针,其中一个指针指向重复字符串的第一个,然后另一个指针向后遍历并计数,就能得到重复的个数。我们仔细研究例子3,可以发现,当个数是两位数的时候,比如12,这里是将12拆分成1和2,然后存入数组的。那么比较简便的提取出各个位上的数字的办法就是转为字符串进行遍历。另外,由于我们需要对原数组进行修改,则需要一个指针cur来标记下一个可以修改的位置,那么最终cur的值就是新数组的长度,直接返回即可。

具体来看代码,我们用i和j表示双指针,开始循环后,我们用j来找重复的字符串的个数,用一个while循环,最终j指向的是第一个和i指向字符不同的地方,此时我们需要先将i位置的字符写进chars中,然后我们判断j是否比i正好大一个,因为只有一个字符的话,后面是不用加个数的,所以直接跳过。否则我们将重复个数转为字符串,然后提取出来修改chars数组即可,注意每次需要将i赋值为j,从而开始下一个字符的统计,参见代码如下:

class Solution {
public:
int compress(vector<char>& chars) {
int n = chars.size(), cur = ;
for (int i = , j = ; i < n; i = j) {
while (j < n && chars[j] == chars[i]) ++j;
chars[cur++] = chars[i];
if (j - i == ) continue;
for (char c : to_string(j - i)) chars[cur++] = c;
}
return cur;
}
};

类似题目:

Count and Say

Encode and Decode Strings

Design Compressed String Iterator

参考资料:

https://leetcode.com/problems/string-compression/discuss/118472/C++-simple-solution-(-EASY-to-understand-)-with-explanation

LeetCode All in One 题目讲解汇总(持续更新中...)

[LeetCode] String Compression 字符串压缩的更多相关文章

  1. 443. String Compression字符串压缩

    [抄题]: Given an array of characters, compress it in-place. The length after compression must always b ...

  2. LeetCode String Compression

    原题链接在这里:https://leetcode.com/problems/string-compression/description/ 题目: Given an array of characte ...

  3. POJ-2406(KMP+字符串压缩)

    Power String POJ-2406 字符串压缩模板题,但是是求有多少个这样最短的子串可以组成s. #include<iostream> #include<cstring> ...

  4. codeforces 825F F. String Compression dp+kmp找字符串的最小循环节

    /** 题目:F. String Compression 链接:http://codeforces.com/problemset/problem/825/F 题意:压缩字符串后求最小长度. 思路: d ...

  5. LeetCode 344. Reverse String(反转字符串)

    题目描述 LeetCode 344. 反转字符串 请编写一个函数,其功能是将输入的字符串反转过来. 示例 输入: s = "hello" 返回: "olleh" ...

  6. Leetcode 344:Reverse String 反转字符串(python、java)

    Leetcode 344:Reverse String 反转字符串 公众号:爱写bug Write a function that reverses a string. The input strin ...

  7. [LeetCode]面试题 01.06. 字符串压缩

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

  8. 443. String Compression - LeetCode

    Question 443. String Compression Solution 题目大意:把一个有序数组压缩, 思路:遍历数组 Java实现: public int compress(char[] ...

  9. 【leetcode】443. String Compression

    problem 443. String Compression Input ["a","a","b","b"," ...

随机推荐

  1. cookie session的共同点和区别

    由于HTTP协议是无状态的,在WEB系统中,怎么识别请求来自于哪里呢?是哪一个用户发起的请求呢? 为了解决这一个问题, HTTP协议引入了cookie和session这两个概念 cookie是服务器传 ...

  2. css3控制div上下跳动

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. KS检验统计量的扩展应用(CMap)

    KS检验统计量的扩展应用 KS(Kolmogorov-Smirnov)检验是比较两个经验分布之间是否存在差异. 我们设X1, X2,-, Xm, Y1, Y2,-, Ym为两个独立随机样本,分别满足假 ...

  4. CountDownLatch 使用说明

    CountDownLatch是一种java.util.concurrent包下一个同步工具类,它允许一个或多个线程等待直到在其他线程中一组操作执行完成. CountDownLatch的用法非常简单,下 ...

  5. Spring MVC之适配器的获取及执行(RequestMappingHandlerAdapter)

    首先看下doDispatch()方法如何找到适合的适配器来执行方法的: protected HandlerAdapter getHandlerAdapter(Object handler) throw ...

  6. Beta冲刺第七天

    一.昨天的困难 没有困难. 二.今天进度 1.林洋洋:MD图片上传,修复权限问题,修复本地存储判空问题,修复协作申请没有过滤问题. 2.黄腾达:添加文件链接和邀请链接复制功能,协作树界面优化. 3.张 ...

  7. 简单的C语言编译器--词法分析器

    1. 定义词法单元Tag   首先要将可能出现的词进行分类,可以有不同的分类方式.如多符一类:将所有逗号.分号.括号等都归为一类,或者一符一类,将一个符号归为一类.我这里采用的是一符一类的方式.C代码 ...

  8. [NOI2015]软件包管理器

    4621 [NOI2015]软件包管理器  题目等级 : 钻石 Diamond   题目描述 Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过 ...

  9. java 注解的实现机制

    一.什么是注解: 注解是标记,也可以理解成是一种应用在类.方法.参数.属性.构造器上的特殊修饰符.注解作用有以下三种: 第一种:生成文档,常用的有@param@return等. 第二种:替代配置文件的 ...

  10. JS 实现MVC的写法

    案例:当select 下拉选择框值变化时,显示其值(不是文本) 常规写法 <h3>JavaScript no MVC</h3>  <div>   <selec ...