给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
示例 2:
输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"
#include <iostream> #include <stack> using namespace std; int longestValidParentheses(string s) { int ans = 0; int temp = 0; if (s.length() == 0 || s.length() == 1 || (s.length() == 2 && s[0] == ')')) return ans; int i = 0, j = 0;//i始终指向离j最近的‘(’,j始终指向i后面的‘)’ while ((s[i] == ')') && i < s.length())i++;//前面如果有‘)’,肯定无法匹配,都不要了 if (i == s.length()) return ans; int *aa=new int[s.length()]; stack<int> a; for (int i = 0; i < s.length(); i++) { if (a.size() == 0) a.push(i); else { if (s[a.top()] == '('&&s[i] == ')') { //将可以匹配的位置对应到数组中的位置的值都赋为1 aa[a.top()] = 1; aa[i] = 1; a.pop(); } else { a.push(i); } } } while (i < s.length())//计算数组中最长的连起来为1的长度 { if (aa[i] == 1) { temp++; ans = (ans < temp) ? temp : ans; } else temp = 0; i++; } delete[] aa; return ans; } int main() { string s="(()()(()(()))()((()))((()(()())()(()))())))()(()()))())))))))()()()()))(((()())((()()(((())))()(()()(())((()))))))(()(()))(((()())()))(()))((((()(()()()())()()(()))(()()(())()((()()())))(())()())()("; int ans=longestValidParentheses(s); std::cout <<ans<< std::endl; return 0; }