括号字符串的有效性和最长有效长度
題目
給定一個字符串str,判斷是不是整體有效的括號字符串。例如,str = “()()()”,返回True,str = “())” 或 “()a()”,返回False。
補充題目
給定一個括號字符串,返回最長的有效字符串的長度。
?
基本思路
原問題。判斷過程如下:
從左到右遍歷str,判斷每一個字符是否是括號,如果不是,直接返回False。
遍歷過程中,檢查目前位置 ‘(‘和 ‘)’的數量,如果 ‘)’的數量多,直接返回False。
遍歷結束后,檢查 ‘(‘和 ‘)’的數量是否相同,如果一樣多返回True,否則返回False。
補充問題。使用動態規劃,類似于最長遞增子序列問題。假設str的長度為N,生成長度為N的dp數組,dp[i]的含義是必須以str[i]結尾的最長有效括號長度子串。dp的求解如下:
dp[0],表示只含有一個括號,dp[0] = 0。
如果dp[i] == ‘(‘,肯定不能作為末尾,dp[i] = 0。
如果dp[i] == ‘)’,dp[i-1]的含義是以str[i-1]結尾的最長有效子串長度,如果 i - dp[i-1] - 1位置上的字符是 ‘(‘,則可以與dp[i]湊成一對,則此時dp[i]最小等于dp[i-1] + 2。此外,如果 i - dp[i-1] - 1位置上的字符變成了有效字符,那么以該位置的前一個位置 i - dp[i-1] - 2的最長有效長度也應該加進來,所以dp[i] = dp[i-1] + 2 + dp[i - dp[i-1] - 2]。
dp[0…N-1]中最大的值就是最長的有效字符串的長度。
?
?
總結
以上是生活随笔為你收集整理的括号字符串的有效性和最长有效长度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 回文最少分割数
- 下一篇: 不用额外变量交换两个整数的值