LeetCode-443 压缩字符串

题目描述

给定一组字符,使用原地算法将其压缩。

压缩后的长度必须始终小于或等于原数组长度。

数组的每个元素应该是长度为1 的字符(不是 int 整数类型)。

在完成原地修改输入数组后,返回数组的新长度。

进阶:
你能否仅使用O(1) 空间解决问题?

示例 1:

输入:
["a","a","b","b","c","c","c"]
\
输出:
返回6,输入数组的前6个字符应该是:["a","2","b","2","c","3"]
\
说明:
"aa"被"a2"替代。"bb"被"b2"替代。"ccc"被"c3"替代。


示例 2:

输入:
["a"]
输出:
返回1,输入数组的前1个字符应该是:["a"]
说明:
没有任何字符串被替代。

示例 3:

输入:
["a","b","b","b","b","b","b","b","b","b","b","b","b"]
输出:
返回4,输入数组的前4个字符应该是:["a","b","1","2"]。
说明:
由于字符"a"不重复,所以不会被压缩。"bbbbbbbbbbbb"被“b12”替代。
注意每个数字在数组中都有它自己的位置。

注意:

  1. 所有字符都有一个ASCII值在[35, 126]区间内。
  2. 1 <= len(chars) <= 1000

解题思路

利用滑动窗口法,左右指针起点都为原数组的首位。
实现步骤如下:

不断右移右指针,使窗口不断增大;
当窗口内出现一个不同的元素时,就可以将元素及其数量(等于左右指针之差)更新在数组中,然后让左指针指向右指针;
遍历到最后一个字符时也需要结算,因此将右指针的终点设为数组之外一格。当右指针移到终点时也要更新数组。

代码实现

#include<iostream>
#include<vector>

using namespace std;
class Solution {
public:
    int compress(vector<char>& chars) {
        int left = 0;
        int size = 0;

        
        for (int right = 0; right <= chars.size(); right++) {
            if (right == chars.size() || chars[right] != chars[left]) {
                chars[size++] = chars[left];
                int cnt = right - left;
                if (cnt > 1) {
                    string str = to_string(cnt);
                    for (char ch : str) {
                        chars[size++] = ch;
                    }
                }

                left = right;
            }
        }
        return size;
    }
};
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 443. 压缩字符串给定一组字符,使用原地算法将其压缩。压缩后的长度必须始终小于或等于原数组长度。数组的每个元素应...
    杏仁小核桃阅读 392评论 0 2
  • 压缩字符串 题目 给定一组字符,使用原地算法将其压缩。 压缩后的长度必须始终小于或等于原数组长度。 数组的每个元素...
    饮酒醉回忆阅读 352评论 0 1
  • 443 String Compression 压缩字符串 Description:Given an array o...
    air_melt阅读 495评论 0 0
  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,531评论 3 44
  • 题目大意 给定一组字符,使用原地算法将其压缩。压缩后的长度必须始终小于或等于原数组长度。数组的每个元素应该是长度为...
    不要甜的红烧肉阅读 135评论 0 0