LeetCode-1021. 刪除最外層的括號
題目如下
有效括號字串為空 ""、"(" + A + ")" 或 A + B ,其中 A 和 B 都是有效的括號字串,+ 代表字串的連線。
例如,"","()","(())()" 和 "(()(()))" 都是有效的括號字串。
如果有效字串 s 非空,且不存在將其拆分為 s = A + B 的方法,我們稱其為原語(primitive),其中 A 和 B 都是非空有效括號字串。
給出一個非空有效字串 s,考慮將其進行原語化分解,使得:s = P_1 + P_2 + ... + P_k,其中 P_i 是有效括號字串原語。
對 s 進行原語化分解,刪除分解中每個原語字串的最外層括號,返回 s 。
來源:力扣(LeetCode)
連結:https://leetcode.cn/problems/remove-outermost-parentheses
剛開始看這道題的時候沒看明白題目的意思是什麼,一會是有效括號字串,一會是拆分為原語(這是什麼意思)。
看了幾分鐘,然後結合下面給的示例(例子只能做參考幫助理解題意,但是千萬不要按照例子去寫程式碼,這樣寫出得程式碼會與例子過於耦合,而有的題目給的例子特別容易誤導人,導致寫出的程式碼能通過例子但是一提交就各種不通過,然後繼續按照沒通過的答案去改程式碼,導致改來改去好多次,最後還是沒通過)。
我分析出以下幾點:
1.題目給的字串s一定是個有效的括號字串(給出一個非空有效字串 s)
2.需要我們進行拆分為多個有效的括號字串(使得:s = P_1 + P_2 + ... + P_k,其中 P_i 是有效括號字串原語)
3.然後需要刪除拆分出來的每個有效字串的最外側括號(刪除分解中每個原語字串的最外層括號)
也就是說需我們做兩件事,拆分、刪除。需要注意的是當只有一對括號時(如:())刪除最外側的操作返回的就是空
然後需要考慮的是如何拆分,才能保證所得的字串是有效的括號?
1.一般處理有效的括號的方法我想的是用棧,但是我只需要知道我的字串是否是有效的括號就行,於是我可以用一個計數器來完成這個工作(因為題目給的字串均是有效的,如果字串中存在無效的括號就不能用這個方法例如:))(( ),當匹配到左括號的時候,計數器減一,當匹配到右括號時計數器加一,最後判斷計數器為0且字串不為空的時候就找到了我們拆分後的字串
2.找到拆分的字串後將它加入到陣列中,然後置為空繼續迴圈拆分,到這裡拆分的工作就完成了
3.從陣列中取出來拆分的字串,然後進行第2步操作——刪除。這裡我用擷取字串的方法完成,需要注意的是隻有一對括號的時候(例如:())是不需要拆分的
綜上,我寫出以下程式碼:
class Solution: def removeOuterParentheses(self, s: str) -> str: ret = [] tmp = '' t = 0 for i in s: if i == '(': t -= 1 if i == ')': t += 1 tmp += i if t == 0 and tmp != '': ret.append(tmp) tmp = '' ans = '' for j in ret: if len(j) <= 1: ans += j else: ans += j[1 : -1] return ans
提交檢視通過。
搜尋
複製