簡體   English   中英

Python 字符串去掉括號時間復雜度

[英]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.translatestr.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM