【力扣日记】443 压缩字符串

房东的猫 提交于 2020-03-02 17:28:34

题目描述

给定一组字符,使用原地算法将其压缩。
压缩后的长度必须始终小于或等于原数组长度。
数组的每个元素应该是长度为1 的字符(不是 int 整数类型)。
在完成原地修改输入数组后,不需要返回内容。

能否以O(1)空间解决问题?

算法

取巧

本来是在原数组上做修改,但是修改了原数组后for语句里的idx不会改变,导致错误。所以取巧在最后一步替代原数组,做到原地修改,但是使用了O(n)的额外空间。

class Solution:
    def compress(self, chars: List[str]) -> int:
        if not chars:return 

        tmp,n,ls=chars[0],1,[]
        for idx,i in enumerate(chars):
            if idx==0:continue
            if tmp==i:n+=1
            else:
                if n==1:
                    ls+=[tmp]
                    tmp=i
                else:
                    ls+=[tmp]+list(str(n))
                    tmp,n=i,1
        ls+=[tmp]+list(str(n)) if n!=1 else [tmp]
        chars[:]=ls

执行用时 :64 ms, 在所有 Python3 提交中击败了72.20%的用户

O(1)空间复杂度

class Solution:
    def compress(self, chars) -> int:
        if not chars:return

        tmp,n,idx=chars[0],1,0
        while idx<len(chars):
            if idx==0:pass
            elif tmp==chars[idx]:n+=1
            else:
                if n==1:tmp=chars[idx]
                else:
                    t2=[tmp]+list(str(n))
                    chars[idx-n:idx]=t2
                    idx=idx-n+len(t2)
                    tmp, n = chars[idx], 1
            idx+=1
        if n!=1:chars[idx-n:idx]=[tmp]+list(str(n))

执行用时 :68 ms, 在所有 Python3 提交中击败了52.17%的用户

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!