leetcode443(压缩字符串)

压缩字符串

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

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

数组的每个元素应该是长度为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。

*/C++
class Solution {
public:
    int compress(vector<char>& chars) {
        int n = chars.size();
        int cur=0;
        for (int i=0,j=0;i<n; i = j){
            while(j<n && chars[j]==chars[i]) j++;
            chars[cur++]=chars[i];
            if(j-i == 1) continue;
            for (char c : to_string(j-i))
                chars[cur++]=c;
        }
        return cur;
    }
};


class Solution {
public:
    int compress(vector<char>& chars) {
        int len = 0;
        for (int i = 0, cnt = 1; i < chars.size(); i++, cnt++) {
            if (i + 1 == chars.size() || chars[i] != chars[i + 1]) {
                chars[len++] = chars[i];
                if (cnt > 1) {
                    for (char ch : to_string(cnt)) {
                        chars[len++] = ch;
                    }
                }
                cnt = 0;
            }
        }
        return len;
    }
};



*/Python 解法
class Solution:
    def compress(self, chars: List[str]) -> int:
        cur = 0
        i,j=0,0
        n = len(chars)
        while i < n :
            while (j < n) and (chars[j] == chars[i]):
                j = j + 1
            chars[cur] = chars[i]
            cur = cur + 1
            if j-i == 1:
                i = j
                continue
            for c in str(j-i):
                chars[cur]=c
                cur = cur + 1
            i=j
        return cur
        
        
        
*/
class Solution:
    def compress(self,chars:List[str]) ->int:
        count = 1
        length =len(chars)
        for index in range(length-1,-1,-1):
            if index > 0 and chars[index] == chars[index-1]:
                count += 1
            else:
                end = index+count
                chars[index:end] = [chars[index]] if count == 1 else [chars[index]] + list(str(count))
                count = 1
        return len(chars)
        
        
        
        
*/
class Solution:
    def compress(self,chars:List[str]) ->int:
        p=0
        w=0
        count=1
        while p<len(chars):
            if p==len(chars)-1 or chars[p] != chars[p+1]:
                if count!=1:
                    s = chars[p] + str(count)
                else:
                    s = chars[p]
                for  i in s:
                    chars[w] = i
                    w += 1
                count=1
            else:
                count += 1
            p += 1
        return w
        
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值