32. Longest Valid Parentheses
Posted agentgamer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了32. Longest Valid Parentheses相关的知识,希望对你有一定的参考价值。
https://leetcode.com/problems/longest-valid-parentheses/description/
来回做了好几遍,虽然AC 了但是这个解发肯定不是最优的。思路是把问题分两步解决:1. 把字符串转换成一个匹配括号的id 序列,比如第0 个和第3 个匹配了,则把0,3都记录在一个数组里。2. 排序生成的这个数组,然后遍历一次找最长的连续串,比如1235 里面,123 就是最长的连续串。排序是必要的,考虑这个例子:()(()),生成的序列是012325, 排序以后则是12345,反应了匹配的括号是确实是连续的。
class Solution { public: int longestValidParentheses(string s) { //transform the problem into 2 sub problems //1. convert string into match pairs //2. calculate connectivity from pairs if (s.length() < 2) { return 0; } //converting matching pair vector<int> stack; vector<int> pairs; for (int i = 0; i < s.length(); i++) { if (s[i] == ‘(‘) { stack.push_back(i); } else if (stack.size() > 0) { auto top = *(stack.end()-1); stack.pop_back(); pairs.push_back(top); pairs.push_back(i); } } //check conseqtivity std::sort(pairs.begin(), pairs.end()); if (pairs.size() == 0) { return 0; } int last = pairs[0]; int cur; int acc = 0; int m = 0; for (int i = 1; i < pairs.size(); i++) { cur = pairs[i]; if (cur - last == 1) { acc++; } else { m = std::max(acc+1, m); acc = 0; } last = cur; } if (acc > 0) { m = std::max(acc+1, m); } return m; } };
以上是关于32. Longest Valid Parentheses的主要内容,如果未能解决你的问题,请参考以下文章