1. 程式人生 > 其它 >LeetCode-1021. 刪除最外層的括號

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

提交檢視通過。

搜尋

複製