LeetCode 1021 刪除最外層的括號

2021-09-25 07:31:12 字數 2213 閱讀 2898

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

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

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

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

示例 1:

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

輸出:"()()()"

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

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

示例 2:

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

輸出:"()()()()(())"

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

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

示例 3:

輸入:"()()"

輸出:""

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

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

**實現

c++:

題目描述說s一定是乙個有效的括號字串。所以不考慮無效的情況。

如果s長度小於等於2的話,這是一種特殊特殊情況,s只能是「」或者「()」,所以結果都會返回「」。

s的第乙個字元一定是『(』,且它一定是乙個「原有效括號字串」最外面的左括號,是要刪掉的,不能放到res中。所以我們從第二個字元開始遍歷s。

在此之前我們還需要定義乙個整形變數c來統計狀態:如果遇到左括號就加1,遇到右括號減1,c初始化為0。

同時我們要檢查c的值,如果c不等於-1就將當前字元追加到res中。

為什麼要這麼做?

因為括號是成對出現的,且跳過了「原有效括號字串」最外面的左括號,所以當遇到「原有效括號字串」最外面的右括號的時候,c應該是-1。這個時候我們就知道乙個"原有效括號字串"遍歷結束。再用同樣的方法遍歷下乙個"原有效括號字串"。

我們用上圖的示例來說明整個演算法流程。

第一步:遇到左括號,c加1,因為遇到左括號,c始終是加的,不可能為負值,所以不用判斷c的值,直接將當前字元追加到res中去;

第二步:遇到右括號,c減1,由於是減,c有可能為負的,所以要判斷c的值。c=0,所以繼續追加;

第三步:遇到右括號,c減1,判斷c的值,為-1,說明乙個「原有效括號字串」遍歷結束。不追加;

第四步: 開始遍歷乙個新的「原有效括號字串」,所以這個字元要跳過;

第五步:遇到左括號,c加1,追加;

第六步:遇到右括號,c減1,判斷c的值,為0,追加;

第七步:遇到右括號,c減1,判斷c的值,為-1,說明乙個「原有效括號字串」遍歷結束。實際上這一步不用做,因為字串最後面乙個字元,是「原有效括號字串」最外面的右括號,我們是不需要的,可以直接跳過;

具體**如下:

class solution 

for(int i=1; ipython:

class solution(object):

def removeouterparentheses(self, s):

""":type s: str

:rtype: str

"""if len(s) <= 2:

return ""

flag = 0

i = 1

result = ""

while iif s[i] == '(':

flag += 1

else:

flag -= 1

if flag == -1:

i += 2

flag = 0

continue

result += s[i]

i += 1

return result

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,考慮將其進行原語...