LeetCode75——Day9

文章目录

一、题目

443. String Compression

Given an array of characters chars, compress it using the following algorithm:

Begin with an empty string s. For each group of consecutive repeating characters in chars:

If the group's length is 1, append the character to s.

Otherwise, append the character followed by the group's length.

The compressed string s should not be returned separately, but instead, be stored in the input character array chars. Note that group lengths that are 10 or longer will be split into multiple characters in chars.

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

You must write an algorithm that uses only constant extra space.

Example 1:

Input: chars = ["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: The groups are "aa", "bb", and "ccc". This compresses to "a2b2c3".

Example 2:

Input: chars = ["a"]

Output: Return 1, and the first character of the input array should be: ["a"]

Explanation: The only group is "a", which remains uncompressed since it's a single character.

Example 3:

Input: chars = ["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: The groups are "a" and "bbbbbbbbbbbb". This compresses to "ab12".

Constraints:

1 <= chars.length <= 2000

chars[i] is a lowercase English letter, uppercase English letter, digit, or symbol.

二、题解

O(n)时间复杂度,O(1)空间复杂度的实现,和题解略有区别

cpp 复制代码
class Solution {
public:
    int compress(vector<char>& chars) {
        int n = chars.size();
        int index = 0, fast = 0;
        while(fast < n){
            char curChar = chars[fast];
            int curIndex = fast;
            while(fast < n && chars[fast] == curChar) fast++;
            int gap = fast - curIndex;
            if(gap == 1) chars[index++] = chars[curIndex];
            else{
                chars[index++] = chars[curIndex];
                string tmp = to_string(gap);
                for(int i = 0;i < tmp.length();i++) chars[index + i] = tmp[i];
                index += tmp.length();
            }
        }
        return index;
    }
};
相关推荐
老王熬夜敲代码几秒前
ref关键字
开发语言·c++
今天你TLE了吗1 分钟前
LeeCode Hot100随机链表的复制 java易懂题解
java·数据结构·链表
山峰哥4 分钟前
现代 C++ 的最佳实践:从语法糖到工程化思维的全维度探索
java·大数据·开发语言·数据结构·c++
CoderYanger4 分钟前
动态规划算法-两个数组的dp(含字符串数组):43.不同的子序列
java·算法·leetcode·动态规划·1024程序员节
Xの哲學5 分钟前
Linux I3C驱动深度剖析: 从原理到实战的全面解析
linux·服务器·算法·架构·边缘计算
秦苒&14 分钟前
【C语言指针一】从入门到通透:核心知识点全梳理(内存、变量、运算、const修饰)
c语言·开发语言·c++
蓑衣夜行17 分钟前
QtWebEngine 自动重启方案
开发语言·c++·qt·web·qwebengine
爱喝热水的呀哈喽19 分钟前
chns方程 推导简单的能量耗散律,分部积分向量形式,sav初简介
算法
Source.Liu19 分钟前
【LibreCAD】点实体源码解析
c++·qt·cad
代码游侠21 分钟前
应用——统计文件字符数、单词数、行数
服务器·笔记·算法