1. 程式人生 > >去掉字串當中的連續k個0,Python版

去掉字串當中的連續k個0,Python版

題目:
給定字串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、發現大多數字符串的處理,幾乎都能降到時間複雜度是一遍字串迴圈,空間複雜度為若干變數。