leetcode刪除最外層的括號 1021

2021-10-23 15:37:07 字數 1992 閱讀 8148

有效括號字串為空 ("")、"(" + a + 「)」 或 a + b,其中 a 和 b 都是有效的括號字串,+ 代表字串的連線。例如,"","()","(())()" 和 「(()(()))」 都是有效的括號字串。

如果有效字串 s 非空,且不存在將其拆分為 s = a+b 的方法,我們稱其為原語(primitive),其中 a 和 b 都是非空有效括號字串。

給出乙個非空有效字串 s,考慮將其進行原語化分解,使得:s = p_1 + p_2 + … + p_k,其中 p_i 是有效括號字串原語。

對 s 進行原語化分解,刪除分解中每個原語字串的最外層括號,返回 s 。

輸入:"(()())(())"

輸出:"()()()"

解釋:輸入字串為 「(()())(())」,原語化分解得到 「(()())」 + 「(())」,

刪除每個部分中的最外層括號後得到 「()()」 + 「()」 = 「()()()」。

address

def

remove_outer_parentheses

(s:str)-

>

str:

# 思路 關鍵在於如何判斷哪些括號是最外層括號.

# 1. 雙指標計數

# 使用雙指標的意義在於,用兩個指標找到所有最外層左右括號的下標

# 一開始為0,碰到左括號, 計數+1,碰到有括號,計數-1.當計數為0時,就找到了最外層的右括號.

# (()())()

# 12121010 得到(0, 5)和(6, 7)

# primitive_indices =

# left, count = 0, 0

# for i in range(len(s)):

# if s[i] == '(':

# count += 1

# elif s[i] == ')':

# count -= 1

# if count == 0: # 找到最外層右括號

# left = i + 1 # 更新最外層左括號指標

## return ''.join(s[m+1:n] for m, n in primitive_indices)

# 2. 單指標計數

# 一次遍歷過程中,直接把非最外層的括號放進答案裡

# res, count = , 0

# for c in s:

# # 當count=0且c=='('時,表示剛開始不需要加入

# if c == '(' and count > 0:

# # 當count=1且c==')'時,表示到達末尾,count這時候為0也不許要加入

# if c == ')' and count > 1:

# if c == '(':

# count += 1

# else:

# count -= 1

## return ''.join(res)

# 3. 單調棧(棧裡面只存在左括號,右括號僅僅是用來消滅左括號的)

# 碰到'('入棧,碰到')'就把棧頂的乙個'('消掉

# 如果棧為空,那麼剛剛碰到的')'就是最外層右括號,如果入棧前棧為空,則即將

# 入棧的'('就是最外層左括號

res, stack ='',

for c in s:

if c ==

'(':

if stack:

res += c

'(')

if c ==

')':

stack.pop(

)if stack:

res += c

return res

LeetCode 1021 刪除最外層括號

有效括號字串為空 a 或 a b,其中 a 和 b 都是有效的括號字串,代表字串的連線。例如,和 都是有效的括號字串。如果有效字串 s 非空,且不存在將其拆分為 s a b 的方法,我們稱其為原語 primitive 其中 a 和 b 都是非空有效括號字串。給出乙個非空有效字串 s,考慮將其進行原語...

LeetCode 1021 刪除最外層的括號

有效括號字串為空 a 或 a b,其中 a 和 b 都是有效的括號字串,代表字串的連線。例如,和 都是有效的括號字串。如果有效字串 s 非空,且不存在將其拆分為 s a b 的方法,我們稱其為原語 primitive 其中 a 和 b 都是非空有效括號字串。給出乙個非空有效字串 s,考慮將其進行原語...

leetcode 1021 刪除最外層的括號

有效括號字串為空 a 或 a b,其中 a 和 b 都是有效的括號字串,代表字串的連線。例如,和 都是有效的括號字串。如果有效字串 s 非空,且不存在將其拆分為 s a b 的方法,我們稱其為原語 primitive 其中 a 和 b 都是非空有效括號字串。給出乙個非空有效字串 s,考慮將其進行原語...