• 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;
    }
    
    };
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    希尔排序之C++实现(初级版)
    CF9D How many trees?
    IOI2015 boxes纪念品盒
    CSP-S 2019图论总结
    数据生成器
    Special-Judge模板
    CF293B Distinct Paths
    浅谈几种常见的剪枝方式
    CF620E New Year Tree
    浅谈DFS序
  • 原文地址:https://www.cnblogs.com/itdef/p/13609231.html
Copyright © 2020-2023  润新知