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 2020-09-03 18:38  itdef  阅读(203)  评论(0编辑  收藏  举报

导航