20. Valid Parentheses

错误解法:

"[])"就会报错,没考虑到出现')'、']'、'}'时,stack为空的情况,这种情况也无法匹配

class Solution {
public:
bool isValid(string s) {
if(s.empty())
return false;
stack<char> st;
st.push(s[]);
for(int i = ;i < s.size();i++){
if(s[i] == '(' || s[i] == '[' || s[i] == '{')
st.push(s[i]);
else if(s[i] == ')'){
if(st.top() == '(')
st.pop();
else
return false;
}
else if(s[i] == ']'){
if(st.top() == '[')
st.pop();
else
return false;
}
else if(s[i] == '}'){
if(st.top() == '{')
st.pop();
else
return false;
}
}
return st.empty() ? true : false;
}
};

正确解法:

class Solution {
public:
bool isValid(string s) {
int length = s.size();
if(length < )
return false;
stack<char> result;
for(int i = ;i < length;i++){
if(s[i] == '(' || s[i] == '[' || s[i] == '{')
result.push(s[i]);
else{
if(result.empty())
return false;
if(s[i] == ')' && result.top() != '(')
return false;
if(s[i] == ']' && result.top() != '[')
return false;
if(s[i] == '}' && result.top() != '{')
return false;
result.pop();
}
}
return result.empty();
}
};

32. Longest Valid Parentheses

https://www.cnblogs.com/grandyang/p/4424731.html

这个题求的是最长的连续匹配正确的符号。

匹配错误只可能是右括号')'存在时,堆中没有左括号'('进行匹配。start用来继续这个连续匹配的开始位置,只有在匹配错误的情况下,这个start才更新。

如果匹配成功后,堆中没有左括号'(',则说明从start到当前都是匹配正确了的;

注意必须用i - position.top(),可能出现这种情况'(()()',如果你使用i - position弹出的那个位置,你永远只可能获得长度为2的,不可能获得连续的长度。

class Solution {
public:
int longestValidParentheses(string s) {
int start = ,res = ;
stack<int> position;
for(int i = ;i < s.size();i++){
if(s[i] == '(')
position.push(i);
else if(s[i] == ')'){
if(position.empty())
start = i + ;
else{
position.pop();
res = position.empty() ? max(res,i - start + ) : max(res,i - position.top());
}
}
}
return res;
}
};

自己写的一个版本,更容易理解:

class Solution {
public:
int longestValidParentheses(string s) {
stack<int> sta;
int res = ;
int left = -;
for(int i = ;i < s.size();i++){
if(s[i] == '(')
sta.push(i);
else{
if(sta.empty())
left = i;
else{
int index = sta.top();
sta.pop();
if(sta.empty())
res = max(res,i - left);
else
res = max(res,i - sta.top());
}
}
}
return res;
}
};

301. Remove Invalid Parentheses

这个题是求删除后所有合法的,并且要求删除次数必须最少。

这个题与前面两个题稍稍有点不同,这个题需要用bfs的方式,把每个位置的字符删除加入队列判断是否合法,一旦有合法的就不再进行删除操作,而是把队列中剩下的进行判断是否合法就行了。

使用了visited数组,这样防止了搜索的重复计算

class Solution {
public:
vector<string> removeInvalidParentheses(string s) {
vector<string> res;
unordered_set<string> visited;
visited.insert(s);
queue<string> q;
q.push(s);
bool finished = false;
while(!q.empty()){
string tmp = q.front();
q.pop();
if(isValid(tmp)){
res.push_back(tmp);
finished = true;
}
if(finished)
continue;
for(int i = ;i < tmp.size();i++){
if(tmp[i] != '(' && tmp[i] != ')')
continue;
string t = tmp.substr(,i) + tmp.substr(i+);
if(!visited.count(t)){
visited.insert(t);
q.push(t);
}
}
}
return res;
}
bool isValid(string s){
int count = ;
for(int i = ;i < s.size();i++){
if(s[i] != '(' && s[i] != ')')
continue;
else if(s[i] == '(')
count++;
else{
if(count <= )
return false;
else
count--;
}
}
return count == ;
}
};

leetcode 20. Valid Parentheses 、32. Longest Valid Parentheses 、的更多相关文章

  1. [Leetcode][Python]32: Longest Valid Parentheses

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 32: Longest Valid Parentheseshttps://oj ...

  2. 刷题32. Longest Valid Parentheses

    一.题目说明 题目是32. Longest Valid Parentheses,求最大匹配的括号长度.题目的难度是Hard 二.我的做题方法 简单理解了一下,用栈就可以实现.实际上是我考虑简单了,经过 ...

  3. [LeetCode] 32. Longest Valid Parentheses 最长有效括号

    Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...

  4. 【一天一道LeetCode】#32. Longest Valid Parentheses

    一天一道LeetCode系列 (一)题目 Given a string containing just the characters '(' and ')', find the length of t ...

  5. leetcode解题报告 32. Longest Valid Parentheses 用stack的解法

    第一道被我AC的hard题!菜鸡难免激动一下,不要鄙视.. Given a string containing just the characters '(' and ')', find the le ...

  6. leetcode 32. Longest Valid Parentheses

    Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...

  7. Java [leetcode 32]Longest Valid Parentheses

    题目描述: Given a string containing just the characters '(' and ')', find the length of the longest vali ...

  8. leetcode problem 32 -- Longest Valid Parentheses

    Longest Valid Parentheses Given a string containing just the characters '(' and ')', find the length ...

  9. [leetcode]32. Longest Valid Parentheses最长合法括号子串

    Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...

随机推荐

  1. c#unicode,中文互转

    /// <summary> /// 中文转unicode /// </summary> /// <returns></returns> public s ...

  2. c# Cache 使用实例

    /// <summary> /// 创建缓存项的文件 /// </summary> /// <param name="key">缓存Key< ...

  3. C#生成ZIP压缩包

    生成ZIP压缩包C#代码如下: using System; using System.Collections.Generic; using System.Text; using ICSharpCode ...

  4. IDEA新建javaWeb项目

    创建JavaWeb项目的步骤大致如下: 创建JavaWeb项目之前所需要的条件 - 安装jdk - 安装服务器(如:tomcat) - 安装idea 新建项目 New-->Project...

  5. html页面边框的另一种写法

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. HTML5实现video标签的自定义播放进度条

    现在随着html5的渐热,越来越多的web开发者都开始选择使用html5写出一些比较好的web应用. html代码: <!DOCTYPE html> <html lang=" ...

  7. python的四大函数讲解

    Python的四类函数: 1.普通函数 2.默认函数 3.关键字函数 4.收集参数 1.普通函数 a.定义的时候直接定义变量名 b.调用的时候直接把变量或者值放入指定位置 def 函数名(参数1,参数 ...

  8. JMeter JMeter自身运行性能优化

    JMeter自身运行性能优化   by:授客 QQ:1033553122 测试环境 apache-jmeter-2.13   1.   问题描述 单台机器的下JMeter启动较大线程数时可能会出现运行 ...

  9. 网络基础 cookie详解

    cookie详解 by:授客 QQ:1033553122 cookie干嘛用的? 参见文章http 会话(session)详解: 网络基础 http 会话(session)详解   cookie分类 ...

  10. .NetCore(四) 在Nginx部署

    ​本篇主要体验一下Nginx的使用,之前只接触过IIS. 一.Nginxa) ASP.NET Core内置了Kestrel服务器,但功能简单,主要用于SelfHost,正式运行还是要依赖IIS.Apa ...