[LeetCode] String Compression 字符串压缩
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:
- All characters have an ASCII value in
[35, 126]
. 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;
}
};
类似题目:
Design Compressed String Iterator
参考资料:
LeetCode All in One 题目讲解汇总(持续更新中...)
[LeetCode] String Compression 字符串压缩的更多相关文章
- 443. String Compression字符串压缩
[抄题]: Given an array of characters, compress it in-place. The length after compression must always b ...
- LeetCode String Compression
原题链接在这里:https://leetcode.com/problems/string-compression/description/ 题目: Given an array of characte ...
- POJ-2406(KMP+字符串压缩)
Power String POJ-2406 字符串压缩模板题,但是是求有多少个这样最短的子串可以组成s. #include<iostream> #include<cstring> ...
- codeforces 825F F. String Compression dp+kmp找字符串的最小循环节
/** 题目:F. String Compression 链接:http://codeforces.com/problemset/problem/825/F 题意:压缩字符串后求最小长度. 思路: d ...
- LeetCode 344. Reverse String(反转字符串)
题目描述 LeetCode 344. 反转字符串 请编写一个函数,其功能是将输入的字符串反转过来. 示例 输入: s = "hello" 返回: "olleh" ...
- Leetcode 344:Reverse String 反转字符串(python、java)
Leetcode 344:Reverse String 反转字符串 公众号:爱写bug Write a function that reverses a string. The input strin ...
- [LeetCode]面试题 01.06. 字符串压缩
题目 字符串压缩.利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能.比如,字符串aabcccccaaa会变为a2b1c5a3.若"压缩"后的字符串没有变短,则返回原先 ...
- 443. String Compression - LeetCode
Question 443. String Compression Solution 题目大意:把一个有序数组压缩, 思路:遍历数组 Java实现: public int compress(char[] ...
- 【leetcode】443. String Compression
problem 443. String Compression Input ["a","a","b","b"," ...
随机推荐
- bash下常用快捷键
Ctrl-A 相当于HOME键,用于将光标定位到本行最前面Ctrl-E 相当于End键,即将光标移动到本行末尾Ctrl-B 相当于左箭头键,用于将光标向左移动一格Ctrl-F 相当于右箭头键,用于将光 ...
- linux,windows,ubuntu下git安装与使用
ubuntu下git安装与使用:首先应该检查本地是否已经安装了git ,如果没有安装的话,在命令模式下输入 sudo apt-get install git 进行安装 输入git命令查看安装状态及常用 ...
- 从0开始的LeetCode生活—461-Hamming Distance(汉明距离)
题目: The Hamming distance between two integers is the number of positions at which the corresponding ...
- 需求分析&原型改进
需求&原型改进 一.给目标用户展现原型,与目标用户进一步沟通理解需求. 1.用户痛点:需要随时随地练习四则运算,并能看到用户的统计数据. 2.用户反馈:较好地解决练习需求,若能加入班级概念则更 ...
- 201621123025《Java程序设计》第二周学习总结
1.本周学习总结 以几个关键词描述本周的学习内容.并将关键词之间的联系描述或绘制出来. 答:java的两种数据类型:基本数据类型和引用数据类型:==与equals的区别:动态数组. 2.书面作业 1. ...
- MySQL 操作详解
MySQL 操作详解 一.实验简介 本节实验中学习并实践 MySQL 上创建数据库.创建表.查找信息等详细的语法及参数使用方法. 二.创建并使用数据库 1. 创建并选择数据库 使用SHOW语句找出服务 ...
- 在arc模式下 CGImage 释放问题
//大图bigImage //定义myImageRect,截图的区域 if (imagecount >= 3) { CGRect myImageRect; if (i.size.width< ...
- 纯CSS垂直居中的四种解决方案
总结了几种解决方法 但也不是说除了我说的就没有其他方法了 第一个.利用flex布局 代码: 效果: 第二个.利用transform 的 translate属性 代码: 效果: 第三个.使用伪类::af ...
- php析构方法
析构方法说明: 1. 析构方法会自动调用 2. 析构方法主要用于销毁资源(比如释放数据库的链接,图片资源...销毁某个对象..); 析构函数会在到对象的所有的引用都被删除或者当对象被显示销毁时执行. ...
- 泛型的 typeof
static void Main(string[] args) { TestTypeOf<string>(); Console.ReadKey(); } static void TestT ...