【算法】括號問題

1. 合法括號深度

一個合法的括號匹配序列有以下定義:
1、空串""是一個合法的括號匹配序列
2、如果"X"和"Y"都是合法的括號匹配序列,"XY"也是一個合法的括號匹配序列
3、如果"X"是一個合法的括號匹配序列,那麼"(X)"也是一個合法的括號匹配序列
4、每個合法的括號序列都可以由以上規則生成。
例如: "","()","()()","((()))"都是合法的括號序列
對於一個合法的括號序列我們又有以下定義它的深度:
1、空串""的深度是0
2、如果字符串"X"的深度是x,字符串"Y"的深度是y,那麼字符串"XY"的深度爲max(x,y) 3、如果"X"的深度是x,那麼字符串"(X)"的深度是x+1
例如: "()()()"的深度是1,"((()))"的深度是3。牛牛現在給你一個合法的括號序列,需要你計算出其深度。 

def depth(s):
    left = 0
    res = 0
    for i in range(len(s)):
        if s[i] == '(':
            left += 1
            res = max(left, res)
        else:
            left -= 1
    return res

2. 補充缺失括號

一個完整的括號字符串定義規則如下:
1、空字符串是完整的。
2、如果s是完整的字符串,那麼(s)也是完整的。
3、如果s和t是完整的字符串,將它們連接起來形成的st也是完整的。
例如,"(()())", ""和"(())()"是完整的括號字符串,"())(", "()(" 和 ")"是不完整的括號字符串。
牛牛有一個括號字符串s,現在需要在其中任意位置儘量少地添加括號,將其轉化爲一個完整的括號字符串。請問牛牛至少需要添加多少個括號。 

def valid(s):
    left = 0 #需要與之匹配的左括號個數
    right = 0 #需要與之匹配的右括號個數
    for i in range(len(s)):
        if s[i] == '(':
            left += 1
        if s[i] == ')':
            if left == 0:
                right += 1
            else:
                left -= 1
    return left + right

3. 有效的括號

給定一個只包括 '('')''{''}''['']' 的字符串,判斷字符串是否有效。

有效字符串需滿足:

  1. 左括號必須用相同類型的右括號閉合。
  2. 左括號必須以正確的順序閉合。

注意空字符串可被認爲是有效字符串。

class Solution:
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        left = []
        right = []
        for i in range(len(s)):
            if s[i] in ["(","[","{"]:
                left.append(s[i])
            else:
                right.append(s[i])
                if left == []:
                    return False
                if (s[i] == ')' and left[-1] == '(') or (s[i] == ']' and left[-1] == '[') or (s[i] == '}' and left[-1] == '{'):
                    left.pop()
                    right.pop()
        if left == [] and right == []:
            return True
        else:
            return False

4. 最長有效括號(dp)

給定一個只包含 '(' 和 ')' 的字符串,找出最長的包含有效括號的子串的長度。

class Solution:
    def longestValidParentheses(self, s):
        """
        :type s: str
        :rtype: int
        """
        if s == '':
            return 0
        dp = [0 for i in range(len(s))]
        for i in range(1,len(s)):
            index = i-dp[i-1]-1
            if index >= 0 and s[i] == ')' and s[index] == '(':
                dp[i] = dp[i-1] + 2
                if index - 1 > 0:
                    dp[i] += dp[index-1]
                
        
        return max(dp)

5. 生成括號

給出 n 代表生成括號的對數,請你寫出一個函數,使其能夠生成所有可能的並且有效的括號組合。

class Solution:
    def __init__(self):
        self.list = []
    def generateParenthesis(self, n):
        """
        :type n: int
        :rtype: List[str]
        """
        if n == 0:
            return ''
        self.generate('',self.list,n,n)
        return self.list
    
    def generate(self, sub, l, left, right):
        if left > right:
            return
        if left > 0:
            self.generate(sub + '(', self.list, left-1, right)
        if right > 0:
            self.generate(sub + ')', self.list, left, right-1)
        if left == 0 and right == 0:
            self.list.append(sub)
            return 

6. 使括號有效的最少添加

https://leetcode-cn.com/problems/minimum-add-to-make-parentheses-valid/

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

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

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

給定一個括號字符串,返回爲使結果字符串有效而必須添加的最少括號數。

class Solution(object):
    def minAddToMakeValid(self, S):
        """
        :type S: str
        :rtype: int
        """
        #每遇到一次不合法(沒有左括號匹配當前右括號),結果就加一
        num= 0
        res = 0
        for item in S:
            if num < 0:
                res += 1
                num = 0
            if item == "(":
                num += 1
            else:
                num -= 1
        #最後若num不爲0,則剩餘的也是不合法的
        res += abs(num)
        return res

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章