方法I:动态规划
len[i]表示从i开始到结束的最长合法括号串长度,则:
如果s[i] == "(" 且 s[i+len[i+1]+1]==")",len[i] = len[i+1] + 2
否则len[i] = 0
方法II:辅助栈
跟那个直方图求最大面积有点类似,用一个栈保存合法括号串的长度,显然长度只能是大于0的偶数(废话),所以可以用0表示"("。
如果当前元素是"(",将0压栈
如果当前元素是")",依次查看栈顶元素并弹栈
如果栈顶元素大于0,说明这是一个合法括号串的长度,那么累加到总长度上
如果栈顶元素等于0,说明遇到了一个"(",将总长度+2,然后重新压栈,如果有必要,更新最长括号长度
这样遍历完s以后,栈里面都是一些局部括号串的长度,以及一些0(代表未匹配的"("),然后再做一遍上面的操作即可
代码:(方法II)
1 int longestValidParentheses(string s) { 2 stack<int> st; 3 int len = 0; 4 int top = 0; 5 int maxLen = 0; 6 7 for (int i = 0; i < s.length(); i++) { 8 if (s[i] == '(') 9 st.push(0); 10 else { 11 len = 0; 12 while (!st.empty()) { 13 int top = st.top(); 14 st.pop(); 15 len += top; 16 if (top == 0) { 17 len += 2; 18 st.push(len); 19 break; 20 } 21 } 22 maxLen = max(maxLen, len); 23 } 24 } 25 26 len = 0; 27 while (!st.empty()) { 28 top = st.top(); 29 st.pop(); 30 if (top > 0) 31 len += top; 32 else { 33 maxLen = max(maxLen, len); 34 len = 0; 35 } 36 } 37 maxLen = max(maxLen, len); 38 39 return maxLen; 40 }