首页 > 代码库 > Leetcode#32 Longest Valid Parentheses

Leetcode#32 Longest Valid Parentheses

原题地址

 

方法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 }

 

Leetcode#32 Longest Valid Parentheses