给定一个仅包含字符的字符串(’ 和 ‘)’,返回最长有效的长度(出色地-形成) 括号子弦。
示例1:
输入:s = “(()”
输出:2
说明:最长的有效括号子字符串是 “()” 。
示例2:
输入:s = “)()())”
输出:4
说明:最长的有效括号子字符串是 “()()” 。
示例3:
输入:s = “”
输出:0
约束:
0 <= s.length <= 3* 104
s[i] 是 ‘(’, 或者 ‘)’。
解决方案 :
方法
在这里,方法无非是我们使用堆栈,当我们遇到开头支撑时,我们将其索引推入堆栈中,每当我们触摸闭合支架时,我们就会看到堆栈的顶部,如果它的大小是一个,则意味着闭合括号已经统治了开头括号。然后,我们将堆栈的最高值编辑为闭合支架的索引。
如下所示,图片清楚地描绘了此方法。
- 在这里给出作为行Ans = max给出的答案(ans,索引- stk.top()) 只有当堆栈的大小不是1时,就会遇到闭合支架。
代码
class Solution {
public:int longestValidParentheses(string s) {stack<int>stk;stk.push(-1);int ans = 0;for(int i = 0 ; i < s.size(); i++){if(s[i] == '(')stk.push(i);else{if(stk.size() == 1)stk.top() = i;else{stk.pop();ans = max(ans , i - stk.top());}}}return ans;}
};
class Solution {public int longestValidParentheses(String s) {int leftCount = 0;int rightCount = 0;int maxLength = 0;for (int i = 0; i < s.length(); i++) {if (s.charAt(i) == '(') {leftCount++;} else {rightCount++;}if (leftCount == rightCount) {maxLength = Math.max(maxLength, 2 * rightCount);} else if (rightCount > leftCount) {leftCount = rightCount = 0;}}leftCount = rightCount = 0;for (int i = s.length() - 1; i >= 0; i--) {if (s.charAt(i) == '(') {leftCount++;} else {rightCount++;}if (leftCount == rightCount) {maxLength = Math.max(maxLength, 2 * leftCount);} else if (leftCount > rightCount) {leftCount = rightCount = 0;}}return maxLength;}
}
class Solution:def longestValidParentheses(self, s: str) -> int:stack=[]l=['0']*len(s)for ind,i in enumerate(s):if i=='(':stack.append(ind)else:if stack:l[stack.pop()]='1'l[ind]='1'return max(len(i) for i in ''.join(l).split('0'))
复杂
- 时间复杂性:这里的复杂性是 o ( n ) o(n) o(n),因为我们仅使用一个只有一个带有堆栈的循环,因此它以线性复杂性运行。
- 空间复杂性:这里的空间复杂性将为$ o(n)$,因为我们只使用了一个堆栈,它也将元素也存储在最坏的情况下,因此可以使人变得复杂。