专业彩票网站开发,省建设安全监督站的网站,wordpress主题html5,宁波外贸公司招聘给你一个只包含 ( 和 ) 的字符串#xff0c;找出最长有效#xff08;格式正确且连续#xff09;括号子串的长度。
示例 1#xff1a; 输入#xff1a;s “(()” 输出#xff1a;2 解释#xff1a;最长有效括号子串是 “()” 示例 2#xff1a; 输入#xff1a;s “…给你一个只包含 ( 和 ) 的字符串找出最长有效格式正确且连续括号子串的长度。
示例 1 输入s “(()” 输出2 解释最长有效括号子串是 “()” 示例 2 输入s “)()())” 输出4 解释最长有效括号子串是 “()()” 示例 3 输入s “” 输出0 提示 0 s . l e n g t h 3 ∗ 1 0 4 0 s.length 3 * 10^4 0s.length3∗104s[i] 为 ( 或 ) 思路
使用栈将 栈底 元素为当前已经遍历过的元素中「最后一个没有被匹配的右括号的下标」这样的做法主要是考虑了边界条件的处理栈里其他元素维护左括号的下标对于遇到的每个 ‘(’ 我们将它的下标放入栈中对于遇到的每个 ‘)’ 我们先弹出栈顶元素表示匹配了当前右括号 如果栈为空说明当前的右括号为没有被匹配的右括号我们将其下标放入栈中来更新我们之前提到的「最后一个没有被匹配的右括号的下标」如果栈不为空当前右括号的下标减去栈顶元素即为「以该右括号为结尾的最长有效括号的长度」 我们从前往后遍历字符串并更新答案即可。注意一开始栈为空第一个字符为左括号的时候我们会将其放入栈中这样就不满足提及的「最后一个没有被匹配的右括号的下标」为了保持统一我们在一开始的时候往栈中放入一个值为 −1 的元素
class Solution {
public:int longestValidParentheses(string s) {int maxN 0, n s.size();stackint stk;stk.push(-1);for(int i 0; i n; i){if(s[i] (){stk.push(i);}else{stk.pop();if(stk.empty()){stk.push(i);}else{maxN max(maxN, i - stk.top());}}}return maxN;}
};