[英]Python String Remove brackets Time Complexity
假設我想從字符串中刪除括號。
string="abc(d))qd()"
for x in range(len(string)-1,-1,-1):
if string[x] in ["(",")"]:
string=string[:x]+string[x+1:]
return string
如果我從末尾遍歷字符串並每次切出特定索引,則每次切片都需要 O(n) 時間(我想,找不到字符串切片的時間復雜度)。 這將總時間復雜度推至 O(n^2)。 我猜空間是 O(1)。
但是,如果我使用stringList=list(givenString)
將我的字符串轉換為列表,而不是彈出特定索引處的元素,我將該索引處的字符設為空白,即stringList[n]=""
它只需要 O(1) 時間。 后者我可以遍歷列表以加入或使用"".join(stringList)
。 這使我的時間為 O(n),但空間也是 O(n)。
lis=list(string)
for x in range(len(lis)):
if string[x] in ["(",")"]:
lis[x]=""
return "".join(lis)
有沒有更好的辦法?
編輯我在leetcode 1249上參考這個問題時問了這個問題,所以我不能只從字符串中刪除所有括號。 這就是為什么我沒有使用替換。
我這樣解決了
class Solution:
def minRemoveToMakeValid(self, s: str) -> str:
openBra=[]
closeBra=[]
for x in range(len(s)):
if s[x] in ["(",")"]:
if s[x]==")":
if len(openBra)==0:
closeBra.append(x)
else:
openBra.pop()
else:
openBra.append(x)
bras=set(openBra+closeBra)
print(bras)
ret=""
for x in range(len(s)):
if x not in bras:
ret+=s[x]
return ret
我想知道我是否可以在不增加時間或空間復雜性的情況下就地更改 string 。
事實證明,對於像"abc(d))qd()" * 10**5
這樣的長字符串, str.translate
比str.replace
更快:
132.0 ms listy
8.5 ms replaces
2.0 ms translate
2.1 ms translate2
82.0 ms re_sub
代碼( 在線嘗試! ):
from timeit import timeit
import re
string="abc(d))qd()"
def listy(string):
lis=list(string)
for x in range(len(lis)):
if string[x] in ["(",")"]:
lis[x]=""
return "".join(lis)
def replaces(string):
return string.replace('(', '').replace(')', '')
def translate(string):
return string.translate(str.maketrans('', '', '()'))
def translate2(string, table=str.maketrans('', '', '()')):
return string.translate(table)
def re_sub(string):
return re.sub('[()]', '', string)
funcs = listy, replaces, translate, translate2, re_sub
for f in funcs:
print(f(string))
string *= 10**5
for _ in range(3):
for f in funcs:
t = timeit(lambda: f(string), number=1)
print('%5.1f ms ' % (t * 1e3), f.__name__)
print()
您對這兩個建議解決方案的分析在表面上看起來是正確的,但它沒有以最有效的方式使用 Python 的內置功能。 我只是這樣做:
return string.replace('(', '').replace(')', '')
每個replace
調用都是 O(n)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.