标签:
class Solution { public: int max(int x,int y) { if(x>=y) return x; else return y; } int longestValidParentheses(string s) { stack<int> st; int start=-1; int length=0; for(int i=0;i<s.size();i++) { if(s[i]==‘(‘) st.push(i); else { if(st.size()==0) start=i; else { st.pop(); if(st.size()==0) length=max(length,i-start); else length=max(length,i-st.top()); } } } return length; } };
因为要算匹配长度,所以要记录起始的位置。思路上要分三种情况吧,一种是完全匹配,一种是未匹配的是‘)’,一种是未匹配的是‘(’。如果发现没有左括号可以和右括号匹配,那么只要把右括号位置设置为start,重新开始新一轮的寻找就可以了;如果没有右括号可以和左括号匹配,则要用当前位置减去堆栈栈顶的左括号位置,查看是否有更长的括号匹配长度。
整体思路如下:
1. 记起始匹配位置start=-1;最大匹配长度length=0;(start设置为-1是为了便于计算长度)
2. 考察第i位字符c:
1)如果c为‘(‘,入栈 (由于要计算长度,所以入栈的应该是左括号的位置)
2)如果c为‘)‘,则要进行括号匹配
a. 如果此时栈空,则没有可以匹配的左括号,start=i,重新开始搜索
b. 栈不空表示有可以匹配的左括号,左括号出栈,考察出栈后的情况:
* 如果栈为空,i-start即为当前找到的匹配长度,检查i-start是否为更大的length,是否要更新length;
* 如果栈不为空,则当前栈顶元素是还未匹配的‘(‘,检查i-stack.top()是否比length更大,是否要更新length;
标签:
原文地址:http://www.cnblogs.com/summerkiki/p/5373658.html