leetcode中等443压缩字符串 / 面试题01.06
Posted qq_40707462
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode中等443压缩字符串 / 面试题01.06相关的知识,希望对你有一定的参考价值。
443、压缩字符串
给你一个字符数组 chars ,请使用下述算法压缩:
从一个空字符串 s 开始。对于 chars 中的每组 连续重复字符 :
- 如果这一组长度为 1 ,则将字符追加到 s 中。
- 否则,需要向 s 追加字符,后跟这一组的长度。
压缩后得到的字符串 s 不应该直接返回 ,需要转储到字符数组 chars 中。需要注意的是,如果组长度为 10 或 10 以上,则在 chars 数组中会被拆分为多个字符。
请在 修改完输入数组后 ,返回该数组的新长度。
你必须设计并实现一个只使用常量额外空间的算法来解决此问题。
示例 1:
输入:chars = [“a”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”]
输出:返回 4 ,输入数组的前 4 个字符应该是:[“a”,“b”,“1”,“2”]。
解释:由于字符 “a” 不重复,所以不会被压缩。“bbbbbbbbbbbb” 被 “b12” 替代。
思路:原地返回
类似 26. 删除排序数组中的重复项【简单】
- 每次当读指针
read
移动到某一段连续相同子串的最右侧(read 指向的字符不同于下一个字符时),我们就在写指针write
处依次写入该子串对应的字符和子串长度即可。 - 该子串对应的字符即为读指针read 指向的字符串。我们使用变量
left
记录该子串的最左侧的位置,这样子串长度即为read−left+1
。
class Solution
public int compress(char[] chars)
int n = chars.length;
int write = 0, left = 0;
for (int read = 0; read < n; read++)
if (read == n - 1 || chars[read] != chars[read + 1])
chars[write++] = chars[read];
int num = read - left + 1;
if (num > 1) //num取余,倒序写入chars,之后还要反转
int anchar = write;
while (num > 0)
chars[write++] = (char) (num % 10 + '0');
num /= 10;
reverse(chars, anchar, write - 1);
left = read + 1;
return write;
public void reverse(char[] chars, int left, int right)
while (left < right)
char temp = chars[left];
chars[left] = chars[right];
chars[right] = temp;
left++;
right--;
面试题01.06
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
示例1:
输入:“aabcccccaaa”
输出:“a2b1c5a3”
示例2:
输入:“abbccd”
输出:“abbccd”
解释:“abbccd"压缩后为"a1b2c2d1”,比原字符串长度更长。
思路:双指针,fast 一直后移,直到和 slow 不相同了,把slow处的字符存到结果里,长度就是slow和fast之间的距离
class Solution
public String compressString(String S)
if(S.length()==0) return S;
char[]chars=S.toCharArray();
StringBuilder sb = new StringBuilder();
int slow = 0, fast = 0;
while(fast<=chars.length)
if(fast==chars.length) sb.append(chars[slow]).append(fast-slow);
else if(chars[fast]!=chars[slow])
sb.append(chars[slow]).append(fast-slow);
slow=fast;
fast++;
return sb.length()<chars.length?sb.toString():S;
以上是关于leetcode中等443压缩字符串 / 面试题01.06的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode | 面试题 01.06. 字符串压缩Python