标签:
Given a string containing just the characters ‘(‘
and ‘)‘
, find the length of the longest valid (well-formed) 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.
给出一个只包含‘(‘和‘)‘字符的字符串,找到最长的合法子串。
主要题目要找的子串而不是子序列,所以思路是利用双指针,I指向开始,J指向结尾,变量cnt 等于I,J之间 ’(‘的字符个数 - ‘)‘的字符个数。
分三种情况:1.当 cnt<0 时J之前的字符都不用考虑,I = J+1, J = I;2.当 cnt = 0是这是I,J之间的字符是合法的,要更新最长长度;3.当 cnt > 0 继续往后迭代J。
这样处理完了之后如果 cnt > 0 说明右边还有一段没有妥善处理,这时候要从右边开始重新做类似的处理,而为了函数复用,可以将右边剩余的子串做一下反转,然后再调用相同的函数即可。因为每个字符最多只需要考虑两次,所以时间复杂度是O(N),N是输入字符串的长度,给出代码如下:
int longp(string s, string& rst); void convert(string& s); int longestValidParentheses(string s) string rst; int mx = longp(s, rst); if (!rst.empty()) { convert(rst); mx = max(mx, longp(rst, rst)); } return mx; } int longp(string s, string& rst) { int n = s.size(); int mx = 0; int cnt = 0; int i=0; for(int j=0; j<n; ++j) { if (‘(‘ == s[j]) ++cnt; else --cnt; if (cnt < 0) { cnt = 0; i = j+1; } else if (0==cnt) mx = max(mx, j-i+1); } if (cnt > 0) rst = s.substr(i); return mx; } void convert(string& s) { reverse(s.begin(), s.end()); for (int i=0; i<s.size(); ++i) if (‘(‘ == s[i]) s[i] = ‘)‘; else s[i] = ‘(‘; }
标签:
原文地址:http://www.cnblogs.com/zhiguoxu/p/5469394.html