去掉字符串当中的连续k个0,Python版

来源:互联网 发布:淘宝追加的评论不见了 编辑:程序博客网 时间:2024/05/17 05:59

题目:
给定字符串str 和一个整数k。如果str中恰好出现了连续的k个0,则将k个0删除。
比如,给定字符串str = “0000fw300001203h000ui0000re3_0000”,k=4。返回的结果为“fw31203h000uire3_”。

代码:

class StringAlgorithm(object):    def __init__(self):        pass    def remove_k_zeros(self, string, k):        if string == "" or k <= 0 :            return ""        start = -1        count = 0        label = []        for i in xrange(0, len(string)):            if string[i] == "0":                count += 1            else:                if count == k:                    label.append(start)                start = i                count = 0        temp = string        while label:            tag = label.pop()            string = string.replace(temp[tag+1:tag+k+1], "")        return string

解析:
1、确定算法的时间复杂度为 o(N),空间复杂度为o(1)。但是我的写法中,在if count == k: 语句之后,本来想写一句

string = string.replace(string[start+1:start+1+k], "")

但是报了一句错,所以就没有按照这种写法来,所以写的时候还是将所有的start标签记录了下来,最后从后向前做了一遍k个0的剔除工作。这样的话,时间复杂度为 o(n),空间复杂度最差为o(n/(k+1)),也就是多花了这么多的内存用来存储start标签。用以记录到底哪些位置是 k 个 0。
2、start 表示 k 个 0 的起始位置,count用来记录 0 的个数。但是实际上有更好的办法,也就是 start = start == -1 ? i : start,当然这不是python语法。当记录到0的时候,start就从当前位置开始,若是之前有记录到0,那么start值不变,否则,start记为 -1。这样的话,能够将空间复杂度降得更低。

体会:
1、了解到 python中没有 :**这样的语法。
2、想写个python库,里面放上绝大多数的算法的最优解,当然,由于所有的函数都独立,所以都是静态的方法。
3、发现大多数字符串的处理,几乎都能降到时间复杂度是一遍字符串循环,空间复杂度为若干变量。