【LeetCode】最长括号匹配Longest Valid Parentheses
来源:互联网 发布:java注解用处 编辑:程序博客网 时间:2024/05/21 01:54
Longest Valid Parentheses [ 最长括号匹配 ]
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.
(1)C++
#include "stdafx.h"#include <iostream>#include <stack>#include <algorithm> //max()函数//#include <math.h>using namespace std;int GetLongestParenthese(const char* p) { int size = (int)strlen(p); stack<int> s; int start = -1; //将起点设为-1 这样计算最长匹配长度时,只需end - start即可! int answer = 0; //最终解 for (int i = 0; i < size; i++) { if (p[i] == '(') { s.push(i); //因为入栈的一定是左括号,故没必要将其本身入栈,应将当前遍历字符的 索引 入栈! } else { //p[i] == ')' if (s.empty()) { //说明此时没有左括号与之匹配。将该点(i)设为计数起点(start)。 类似之前start = -1的思想。 start = i; } else { //说明栈s中有与之匹配的左括号 s.pop(); //见到一个匹配 就将其弹栈 if (s.empty()) { //说明此时栈空:不再有左括号与当前遍历元素匹配。-> 比较answer(当前最大长度)与i-start的长短,更新answer。 answer = max(answer, i - start); //answer = answer >= (i - start) ? answer : i - start; } else { //说明弹出后,栈s中依然有尚未匹配的左括号。-> 比较answer(当前最大长度)与i-s.top()的长短,更新answer。 answer = max(answer, i - start); } } } } return answer;}int main(){ char* ch = "()())((())())"; int num = GetLongestParenthese(ch); cout << num << endl; return 0;}
(2)Java
(1)Javapublic class Solution { public int longestValidParentheses(String s) { if (s == null) { return 0; } Stack<Integer> stack = new Stack<Integer>(); int maxLen = 0; int accumulatedLen = 0; for(int i = 0; i < s.length(); i++) { if (s.charAt(i) == '(') { stack.push(i); } else { if (stack.isEmpty()) { accumulatedLen = 0; } else { int matchedPos = stack.pop(); int matchedLen = i - matchedPos + 1; if (stack.isEmpty()) { accumulatedLen += matchedLen; matchedLen = accumulatedLen; } else { matchedLen = i - stack.peek(); } maxLen = Math.max(maxLen, matchedLen); } } } return maxLen; }}
【挑战】
可否将空间复杂度由O(N)降至O(1)?
(mark)
阅读全文
1 0
- 【LeetCode】最长括号匹配Longest Valid Parentheses
- [LeetCode]—Longest Valid Parentheses 最长括号匹配
- LeetCode | Longest Valid Parentheses(最长有效的括号匹配)
- [LeetCode] 最长合法括号 longest valid parentheses
- LeetCode Longest Valid Parentheses 括号匹配
- LeetCode: Longest Valid Parentheses (求最长有效匹配括号子串的长度)
- Longest Valid Parentheses(最长的括号匹配)【面试算法leetcode】
- LeetCode | 32. Longest Valid Parentheses——最长有效括号匹配长度
- 寻找最长的括号匹配 Longest Valid Parentheses
- Longest Valid Parentheses:最长括号子段匹配
- 最长连续有效括号 Longest Valid Parentheses @LeetCode
- LeetCode--Longest Valid Parentheses(最长有效的括号)
- LeetCode OJ 之 Longest Valid Parentheses (最长有效括号)
- LeetCode 32 Longest Valid Parentheses(最长有效括号)(*)
- LeetCode 32. Longest Valid Parentheses(最长有效括号)
- LeetCode----32. Longest Valid Parentheses(最长有效括号)
- LeetCode-32.Longest Valid Parentheses最长有效括号子串
- leetcode 32. Longest Valid Parentheses 最长有效括号长度
- 51nod 1675 序列变换 (简单莫比乌斯)
- 深入理解Java虚拟机——JVM类加载机制(类加载过程和类加载器)
- 电阻 电容 并联电路
- 国是怎么落后的---封建思想的存在,一个家为单位的,也是一个私立的
- UVA.12230 Crossing Rivers (期望)
- 【LeetCode】最长括号匹配Longest Valid Parentheses
- 《MySQL入门很简单》学习笔记(11)之第11章插入、更新与删除数据(关键词:数据库/MySQL/插入数据/更新数据/删除数据)
- struts2笔记(1)——搭建一个HelloWorld
- ARCore:从Android Studio开始
- ubuntu sudo update跟upgrade的作用和区别
- 用u盘安装linux系统
- Node.js 配置微信 JS-SDK 权限验证服务
- 夜神自动重连
- mysql中innodb和myisam的区别