刷题32. Longest Valid Parentheses
一、题目说明
题目是32. Longest Valid Parentheses,求最大匹配的括号长度。题目的难度是Hard
二、我的做题方法
简单理解了一下,用栈就可以实现。实际上是我考虑简单了,经过5次提交终于正确了。
性能如下:
Runtime: 8 ms, faster than 61.76% of C++ online submissions for Longest Valid Parentheses.
Memory Usage: 9.8 MB, less than 10.71% of C++ online submissions for Longest Valid Parentheses.
代码如下:
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
class Solution {
public:
int longestValidParentheses(string s){
if(s.size()<=1) return 0;
stack<char> st;
vector<int> result;
for(int t=0;t<s.size();t++){
if(s[t]=='('){
st.push(s[t]);
result.push_back(0);
}else if(s[t]==')'){
if(st.empty()){
result.push_back(0);
}else if(st.top() == '('){
st.pop();
if(result.back()>0){
int s = result.size()-1;
//合并所有非 0
while(s>0 && result[s]>0){
s--;
}
if(s < result.size()-2){
int sum = 0,currSize = result.size();
for(int j=s+1;j<currSize-1;j++){
sum += result.back();
result.pop_back();
}
result.back() += sum;
}
int tmp = result.back() + 2;
if(result.size()>0){
result.pop_back();
}
result.back() += tmp;
}else{
result.back() += 2;
}
}
}
}
int max=0,curMax=0;
for(int i=0;i<result.size();i++){
curMax = 0;
int t = i;
while(t<result.size() && result[t]>0){
curMax += result[t];
t++;
}
max = curMax>max ? curMax : max;
}
return max;
}
};
int main(){
Solution s;
cout<<(2==s.longestValidParentheses("(()"))<<endl;
cout<<(4==s.longestValidParentheses(")()())"))<<endl;
cout<<(2==s.longestValidParentheses("()(()"))<<endl;
cout<<(6==s.longestValidParentheses("()(())"))<<endl;
cout<<(4==s.longestValidParentheses("(()()"))<<endl;
cout<<(4==s.longestValidParentheses("(())"))<<endl;
cout<<(6==s.longestValidParentheses("(()())"))<<endl;
cout<<(10==s.longestValidParentheses(")(())(()()))("))<<endl;
cout<<(8==s.longestValidParentheses("((()))())"))<<endl;
return 0;
}
三、优化措施
题解给了4种方法,这4种方法都比较好理解,我上述实现方法属于第3种“栈”,只不过把问题搞复杂了。惭愧!!!
1.暴力法,枚举所有子串,判断合法性,求出最长。
2.动态规划,这一直是我的软肋。
用数组dp表示,其中第 i 个元素表示以下标为 i 的字符结尾的最长有效子字符串的长度。
3.栈
4.不需要额外空间:这种方法非常巧妙,非常考验智商!理解起来不难!
用left和right分别统计左括号和右括号数量,先从左到右统计,遇到左括号left++,遇到右括号right++,如果right==left求最大值,如果left<right则将left=right=0;再从右到左来一遍。
刷题32. Longest Valid Parentheses的更多相关文章
- leetcode 20. Valid Parentheses 、32. Longest Valid Parentheses 、
20. Valid Parentheses 错误解法: "[])"就会报错,没考虑到出现')'.']'.'}'时,stack为空的情况,这种情况也无法匹配 class Soluti ...
- [Leetcode][Python]32: Longest Valid Parentheses
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 32: Longest Valid Parentheseshttps://oj ...
- 32. Longest Valid Parentheses
题目: Given a string containing just the characters '(' and ')', find the length of the longest valid ...
- [LeetCode] 32. Longest Valid Parentheses 最长有效括号
Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...
- leetcode解题报告 32. Longest Valid Parentheses 用stack的解法
第一道被我AC的hard题!菜鸡难免激动一下,不要鄙视.. Given a string containing just the characters '(' and ')', find the le ...
- 【LeetCode】32. Longest Valid Parentheses (2 solutions)
Longest Valid Parentheses Given a string containing just the characters '(' and ')', find the length ...
- leetcode 32. Longest Valid Parentheses
Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...
- Java [leetcode 32]Longest Valid Parentheses
题目描述: Given a string containing just the characters '(' and ')', find the length of the longest vali ...
- leetcode problem 32 -- Longest Valid Parentheses
Longest Valid Parentheses Given a string containing just the characters '(' and ')', find the length ...
随机推荐
- tools.sublime.ConvertToUTF8
sublime乱码,GBK乱码,安装插件ConvertToUTF8 下载ConvertToUTF8,解压,文件夹命名为ConvertToUTF8 sublime->Preferences-> ...
- 2019年第十届蓝桥杯【C++省赛B组】
试题 A: 组队 本题总分:5 分 作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员,组成球队的首发阵容.每位球员担任 1 号位至 5 号位时的评分如下表所示.请你计算首发阵容 ...
- 01.swoole学习笔记--TCP服务器
1.安装swoole扩展 2.网络调试助手进行调试 <?php //创建服务器 $host='192.168.10.31'; $port=; //$model='SWOOLE_PROCESS'; ...
- JS: 子项可以来回交换的两个下拉列表
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...
- BAT 五路internet负载均衡
一个网上下载的bat文件 也不记得从那里下载的了 记得似乎需要管理员权限运行 依稀记得测试有效 放在这里做个记录 @echo off echo. echo ╭─────────╮ echo ╭──── ...
- HTML学习第二天
HTML学习第二天 今天学的比较少,有些乱,先只写一个知识点 三种样式表插入方式 外部样式表: <link rel="stylesheet" type="text/ ...
- 索尼研发的新主机竟兼容现款PSVR!
索尼PlayStation研发负责人Dominic Mallinson在接受媒体记者采访时表示,现款PSVR头戴式虚拟现实装置可用于下一代PS主机. 新主机兼容现款PSVR 而且,即便新主机上市也不要 ...
- 使用Kickstart+pxe自动化安装部署无人值守的linux服务器
Kickstart+pxe Kickstart无人职守安装RHEL5过程分享(详细图解版) 启动应用有:httpd.dhcpd.named.xinetd 无人职守自动批量安装linux系统超详细 参考 ...
- Maven与nexus关系
一.了解Maven,Maven用来干什么呢 1. 优秀的构建工具 通过简单的命令,能够完成清理.编译.测试.打包.部署等一系列过程.同时,不得不提的是,Maven是跨平台的,无论是在Windows.还 ...
- SparkStreaming 笔记
简介 SparkStreaming是流式处理框架,是Spark API的扩展,支持可扩展.高吞吐量.容错的准实时数据流处理. 实时数据的来源可以是:Kafka, Flume, Twitter, Zer ...