Longest Valid Parentheses
2015-09-08 09:32
246 查看
Given a string containing just the characters ’(’ and ’)’, find the length of the longest valid (wellformed) parentheses substring.
For ”(()”, the longest valid parentheses substring is ”()”, which has length = 2.
Another example is ”)()())”, where the longest valid parentheses substring is ”()()”, which has
length = 4.
题意:给定一个字符串仅仅包含(和)找到最长的有效括号字串的长度。
例如:”(()” 有效字符是”()”,长度是2
)()())”有效字符是,()()”长度是4
分析:想要O(n)的解法需要一点技巧,栈中保存的不是‘(’而是‘(’所在的index,在此基础上也要弄清楚几种情况:
每次来了‘(’之后,无条件压栈。如果碰到’)’的话,如果栈不为空,就消除栈内剩余的’(’
第一:消除掉’(‘之后,如果栈内还有剩余的‘(’的话,最长的合法长度就是: maxLength = max(i - (int)st.top() , maxLength); 也就是取:当前’)’的index减去栈顶元素的index 和 原来max_length 两者的最大值。
例如:对于这种情况:()(()(),可以正确的得出最大值为4。
第二:消除掉’)’之后,栈内没有剩余的‘(’了。此时需要引入一个新的变量start,用于表示合法括号字符串的起点。
例如:对于这种情况:())()(),可以正确的得出最大值为4。
start初始为-1,之后每次碰到‘)’且栈为空的时候更新为当前‘)’的index。也就是说无法消除的)之后的括号不可能再和前面的括号合并在一起计算最长序列,所以更新start。
For ”(()”, the longest valid parentheses substring is ”()”, which has length = 2.
Another example is ”)()())”, where the longest valid parentheses substring is ”()()”, which has
length = 4.
题意:给定一个字符串仅仅包含(和)找到最长的有效括号字串的长度。
例如:”(()” 有效字符是”()”,长度是2
)()())”有效字符是,()()”长度是4
class Solution { public: int longestValidParentheses(string s) { if(s.length()==0) { return 0; } int start = -1; int maxLength = 0; stack<int> st; for(int i=0;i<s.length();i++) { if(s.at(i)=='(') { //s.at[i],和s[i]的区别,如果s为空,则at(0)会返回异常,s[0]则是未定义。 st.push(i); //将i的序号入栈。 } else { if(!st.empty()) {//如果栈不为空,就消掉) st.pop(); if(st.empty()==true) { //如果栈内没有元素了。此时要先引入一个新的变量。为start maxLength = max(i - start , maxLength); } else { maxLength = max(i - (int)st.top() , maxLength); //当前i的值,减去栈顶的值,和原来的最大长度比较。 } } else { start = i; //start初始为-1,之后每次 碰到‘)’且栈为空 的时候更新为当前‘)’的index。也就是说无法消除的)之后的括号不可能再和//前面的括号合并在一起计算最长序列,所以更新start。 } } } return maxLength; } };
分析:想要O(n)的解法需要一点技巧,栈中保存的不是‘(’而是‘(’所在的index,在此基础上也要弄清楚几种情况:
每次来了‘(’之后,无条件压栈。如果碰到’)’的话,如果栈不为空,就消除栈内剩余的’(’
第一:消除掉’(‘之后,如果栈内还有剩余的‘(’的话,最长的合法长度就是: maxLength = max(i - (int)st.top() , maxLength); 也就是取:当前’)’的index减去栈顶元素的index 和 原来max_length 两者的最大值。
例如:对于这种情况:()(()(),可以正确的得出最大值为4。
第二:消除掉’)’之后,栈内没有剩余的‘(’了。此时需要引入一个新的变量start,用于表示合法括号字符串的起点。
例如:对于这种情况:())()(),可以正确的得出最大值为4。
start初始为-1,之后每次碰到‘)’且栈为空的时候更新为当前‘)’的index。也就是说无法消除的)之后的括号不可能再和前面的括号合并在一起计算最长序列,所以更新start。
相关文章推荐
- 10款最佳HTML5绘图工具
- 频繁项集挖掘之Aprior和FPGrowth算法
- Android数据库大批量数据插入优化
- mysql启动时提示 can't create/write to file 'D:\mysql\data\prn.pid'
- 证书报错解决方法:Code=3000 "未找到应用程序的“aps-environment”的授权字符串"
- 日期处理工具类
- 每天一个linux命令(7):at命令
- 第一节 MongoDB介绍及下载与安装
- matlab批量修改变量的名称
- 创建ATL工程及使用C++测试COM组件
- includes
- 让input表单输入框不记录输入过信息的方法
- Android Parcelable和Serializable的区别
- linux下oracle10g客户端安装后环境变量的配置
- ADO.NET五大对象
- lvs+keepalived+mha高可用环境搭建过程中遇到的问题
- Eigen解线性方程组
- 条件变量+互斥锁解决生产者消费者模型
- JavaScript中var关键字的使用详解
- NET Native