leetcode 每日一题 32. 最长有效括号
动态规划
思路:
从头开始遍历字符串,当遇到左括号时,dp[i] = 0,当遇到右括号时开始分情况讨论:
①如果s[i-1]为左括号时,则dp[i] = dp[i-2] + 2 (这里要注意数组越界的问题,把i<2的情况单独拿出来)
②如果s[i-1]为右括号时,并且s[i-dp[i-1]-1]为左括号时,dp[i] = dp[i-1]+dp[i-dp[i-1]-2]+2 (注意把越界情况单独拿出来讨论)
然后找到dp中的最大值即为最后结果
例如:
())((()))
代码:
class Solution: def longestValidParentheses(self, s: str) -> int: length = len(s) if length == 0: return 0 dp = [0]*length maxRes = 0 for i in range(1,length): if s[i] == ')': if s[i-1] == '(': dp[i] = (dp[i-2] if i>=2 else 0)+2 elif i-dp[i-1]>0 and s[i-dp[i-1]-1] == '(': dp[i] = dp[i-1]+(dp[i - dp[i - 1] - 2] if(i - dp[i - 1]) >= 2 else 0) + 2 maxRes = max(maxRes,dp[i]) return maxRes
栈
思路:
构建一个栈,栈顶初始值为-1。遍历字符串,当遇见左括号时,将它的下标压入栈中,当遇见右括号时,将栈顶元素推出,如果推出后栈为空,则将此右括号的下标压入栈中,否则用右括号的下标减去栈顶的值,更新最大长度。
(PS:栈顶元素的值其实代表了当前统计合法括号数量时的起始位置的下标)
代码:
class Solution: def longestValidParentheses(self, s: str) -> int: length = len(s) if length == 0: return 0 stack = [-1] maxRes = 0 for i in range(length): if s[i] == '(': stack.append(i) else: stack.pop() if not stack: stack.append(i) else: maxRes = max(maxRes,i-stack[len(stack)-1]) return maxRes