去掉字串當中的連續k個0,Python版
阿新 • • 發佈:2019-01-22
題目:
給定字串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、發現大多數字符串的處理,幾乎都能降到時間複雜度是一遍字串迴圈,空間複雜度為若干變數。