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