有效括號字串為空 ("")、"(" + 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,考慮將其進行原語...