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. RBAC 权限设计(转载)

    来源 :https://blog.csdn.net/rocher88/article/details/43190743 这是我在网上找的一些设计比较好的RBAC权限管理 不知道,像新浪.搜狐.网易.百 ...

  2. 【Linux】CentOS7 安装rabbitmq

    [1.安装erlang环境]yum install http://www.rabbitmq.com/releases/erlang/erlang-19.0.4-1.el7.centos.x86_64. ...

  3. windows下navicate for mysql 零填充不显示

    在mysql数据库中我们在需要某个字段时经常要用到零填充 zerofill,之前碰到了一个大坑,在数据表sql语句中明明规定了 unsigned zerofill:但是一直没有显示出来,以为自己写的s ...

  4. js 复制文本到粘贴板

    //html 在iOS Safari中,剪贴板API有一些限制(实际上是安全措施):   于安全原因,iOS Safari只允许容器中的document.execCommand('copy')文本co ...

  5. CSS--选择符大全(常用css选择符)

    (一)元素选择符 E(某个元素,如p) id(使用id,如#idName) class(使用class,如.myclass) 通配符:* (二)关系选择符 包含选择符:E F(E所有的F包含子代,孙代 ...

  6. Android学习笔记----天地图API开发之UnsatisfiedLinkError

    由于在jniLibs目录下移除了x86的相关so文件,后来又因为需要在PC模拟器上调试,将该文件夹恢复后,增加了天地图的sdk,却忘记将libMapEngine.so文件同时拷贝至x86目录下,导致如 ...

  7. android开发笔记:Handler、Looper、MessageQueen、Message的关系

    一.什么是handler? 注:线程分为主线程(主线程又叫UI线程,只能有一个主线程)和子线程(可以有多个)Handler只能在主线程里运行 handler是Android给我们提供用来更新UI的一套 ...

  8. drop all database objects

    /*Use this sql to drop all objects in a database.*/ -- Drop all SPdeclare @dropSp varchar(max)=''sel ...

  9. NAudio音频文件转换

    1.NuGet安装 NAudio,项目及demo的网址:https://github.com/naudio/NAudio Encode to MP3, WMA and AAC with MediaFo ...

  10. Git的gc功能

    http://blog.csdn.net/lihuanshuai/article/details/37345565 Git的底层并没有采用 CVS.SVN 底层所采用的那套增量式文件系统,而是采用一套 ...