删除最外层的括号
有效括號字符串為空 ("")、"(" + 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:
輸入:"()()"
輸出:""
解釋:
輸入字符串為 “()()”,原語化分解得到 “()” + “()”,
刪除每個部分中的最外層括號后得到 “” + “” = “”。
提示:
S.length <= 10000
S[i] 為 “(” 或 “)”
S 是一個有效括號字符串
解答
將列表轉成字符串''.join(list)
輸出
result= ['(', ')', '(', ')', '(', ')', '(', ')', '(', '(', ')', ')'] 轉換后: ()()()()(())我的解答
- 如果,count>0,則表示還有未匹配的(,count= count-1,result保存)
- 否則,說明遇到了兩個最外層的括號交接處,這個)是孤獨的右括號此時count和result都不變,而且接下來的(不保存。
- flag 初始化為1,當遇到孤獨的右括號時,改變flag的狀態為0,以確保在遇到起始(時,保證不把(添加進result,也不增加count,同時需要更新flag的狀態為1,以確保內部的(不受影響。接下來的其余時候,保證flag=1。
堆棧解決辦法
思路介紹:
result字符串保存結果
遍歷字符串
左括號入棧:若入棧后棧的長度大于1,即該左括號不是原語首個左括號,結果加入’(’
右括號出棧:若出棧后棧的長度大于0,即該右括號不是原語末個右括號,結果加入’)’
作者:dapao
鏈接:https://leetcode-cn.com/problems/remove-outermost-parentheses/solution/ji-jian-si-lu-pythonzhan-by-dapao/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
總結
- 上一篇: 496. 下一个更大元素 I
- 下一篇: 503. 下一个更大元素 II