1. 程式人生 > >Leetcode 921:使括號有效的最少新增(最詳細的解法!!!)

Leetcode 921:使括號有效的最少新增(最詳細的解法!!!)

給定一個由 '('')' 括號組成的字串 S,我們需要新增最少的括號( '(' 或是 ')',可以在任何位置),以使得到的括號字串有效。

從形式上講,只有滿足下面幾點之一,括號字串才是有效的:

  • 它是一個空字串,或者
  • 它可以被寫成 ABAB 連線), 其中 AB 都是有效字串,或者
  • 它可以被寫作 (A),其中 A 是有效字串。

給定一個括號字串,返回為使結果字串有效而必須新增的最少括號數。

示例 1:

輸入:"())"
輸出:1

示例 2:

輸入:"((("
輸出:3

示例 3:

輸入:"()"
輸出:0

示例 4:

輸入:"()))(("
輸出:4

提示:

  1. S.length <= 1000
  2. S 只包含 '('')' 字元。

解題思路

這個問題非常簡單,我們通過stack就可以解決。我們首先建立一個棧stack,然後將S中的元素壓入到stack中。每次壓入元素後,判斷stack頂部元素是不是)S的頂部元素是不是(,如果是的話,將兩者的棧頂元素都彈出。重複上面的操作,知道S為空,最後返回stack的長度即可。

class Solution:
    def minAddToMakeValid(self, S):
        """
        :type S: str
        :rtype: int
        """
s_list = list(S) stack = list() while s_list: tmp = s_list.pop() stack.append(tmp) while stack and s_list and stack[-1]==')' and s_list[-1] == '(': stack.pop() s_list.pop() return len(stack)

對於這個問題,我們不開闢額外的儲存空間也可以解決。我們定義一個變數left

記錄未配對的(數量,然後我們只要遍歷S,判斷遍歷到的元素是不是(,如果是的話,我們left++,否則的話說明配對成功,我們left--。例如

( ) )
|

left = 1

接著遍歷下一個元素

( ) )
  |

left = 0

接著遍歷下一個元素

( ) )
    |

left = -1

我們發現這個時候tmp==-1,說明有一個)沒有配對,我們將tmp=0,同時記錄這個沒有配對的元素right++。我們最後返回的結果就是left+right

class Solution:
    def minAddToMakeValid(self, S):
        """
        :type S: str
        :rtype: int
        """
        right, left, = 0, 0
        for s in S:
            left += 1 if s == '(' else -1
            if left == -1:
                right += 1
                left += 1

        return right + left

我將該問題的其他語言版本新增到了我的GitHub Leetcode

如有問題,希望大家指出!!!