LeetCode 443. 压缩字符串 双指针

地址 https://leetcode-cn.com/problems/string-compression/submissions/

复制代码
给定一组字符,使用原地算法将其压缩。
压缩后的长度必须始终小于或等于原数组长度。
数组的每个元素应该是长度为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” 替代。
注意每个数字在数组中都有它自己的位置。
 
提示:
所有字符都有一个ASCII值在[35, 126]区间内。
1 <= len(chars) <= 1000
复制代码

算法1
使用了双指针,测算出相同的字母和字母的个数
放入新的字符串中

C++ 代码

复制代码
class Solution {
public:
  int compress(vector<char>& chars) {
    int l = 0; int r = 0;
    string ans;
    while (l < chars.size() && r < chars.size()) {
        if (chars[l] == chars[r]) {
            r++;
        }
        else {
            int count = r - l ;
            ans+= (chars[l]);
            if (count != 1)
                ans += to_string(count);
            l = r;
        }
    }
    int count = r - l;
    ans += (chars[l]);
    if(count != 1)
        ans += to_string(count);
    l = r;

    for(int i =0;i <ans.size();i++){
        chars[i]=ans[i];
    }
    return ans.size();
}

};
复制代码

算法2
题目考虑到额外空间只有O(1)
只添加了一个当前长度的变量
然后原地修改

C++ 代码

复制代码
class Solution {
public:

int compress(vector<char>& chars) {
    int l = 0; int r = 0;
    int currChar = chars[l];
    int currlen = l;
    while (l < chars.size() && r < chars.size()) {
        if (chars[l] == chars[r]) r++;

        if (r >= chars.size() || chars[l] != chars[r]) {
            string count = to_string(r - l);
            chars[currlen] = chars[l]; currlen++;
            if(count != "1"){
                for (int i = 0; i < count.size(); i++) {
                    chars[currlen] = count[i]; currlen++;
                }
            }
            l = r;
        }
    }
    return currlen;
}

};
复制代码

 

posted on   itdef  阅读(206)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示