括号的问题在编译原理里用到的很多,做法大半需要用栈。
这个问题有点不一样的地方是,输入很可能不合理,也就是括号很可能不匹配,这怎么搞?我的做法是用一个数组来做标记,依然是左括号入栈(入栈的是他的位置),右括号出栈,当一对括号成功匹配的时候,把标记数组中他们相对应的位置标记为1。这样过一遍之后,扫描一下整个标记数组,有多少个连续的1,就是有多少个连续的匹配,输出一下个数就行了。
class Solution {
public:
int longestValidParentheses(string s) {
int res=0, len = s.length(), tpres;
stack<int> st;
bool vali[len];
memset(vali, 0, sizeof(vali));
for(int i=0;i<len;i++){
if(s[i] == '(') st.push(i);
else{
if(!st.empty()){
vali[st.top()] = 1;
vali[i]=1;
st.pop();
}
}
}
int j=0;
while(j<len){
while(j<len&&vali[j]==0) j++;
int tplen = 0;
while(j<len&&vali[j]==1) {j++;tplen++;}
if(tplen>res) res = tplen;
}
return res;
}
};