20. Valid Parentheses[E]有效的括号
题目
Given a string containing just the characters '(',')','[',']','{' and ‘}’,determine if the input string is valid.
An input string is valid if:
- 1.Open brackets must be closed by the same type of brackets.
- 2.Open brackets must be closed in the correct order.
Note that an empty string is also considered valid.
Example 1:
Input:"()"
Output:true
Example 2:
Input:"()[]{}"
Output:true
Example 3:
Input:"(]"
Output:false
Example 4:
Input:"([)]"
Output:false
Example 5:
Input:"{[]}"
Output:true
思路
leetcode上的解答是这样的:
先考虑简单的情况:只有一种括号
![](https://i.loli.net/2019/05/21/5ce3d69f2d3d896804.jpg)
图1:只有一种括号
定义一个计数器left,如果我们遇到一个开括号,则计数器left加1;如果遇到一个闭括号,此时有两种情况,一是当前left=0,这说明没有配对的开括号,表达式无效;二是left>0,说明还有没配对的开括号,left--。
但是实际情况不止一种括号,但是我们发现,为了保证表达式的每一个子表达式都是也是有效的,每一个闭括号总是与左起最近的开括号是匹配的,如图2。
![](https://i.loli.net/2019/05/21/5ce3d848c7b0852829.jpg)
图2:多个括号的情况
这个时候就要用到栈。在表示问题的递归结构时,由于我们不清楚整体的结构,无法从里到外的解决问题,此时栈可以帮助我们递归地解决问题,从外到内地解决问题。
于是本题的解题思路如下:
* 1.初始化一个堆栈,并初始化一个映射表(用来处理不同种类的括号);
* 2.循环处理所有括号
* 如果是开括号,则push进栈即可;
* 如果是闭括号,那么就需要检查栈顶的元素,如果栈顶的开括号与当前的闭括号匹配(通过查找建立的映射表匹配),则pop出栈;如果不匹配,说明表达式无效;
- 3.当处理完所有括号后,如果栈中还有元素,说明表达式无效。
就想在玩一个消消乐,只有当开括号和闭括号匹配的时候才能消掉这一对括号。
Tips
栈
一种线性存储表。它有以下两种特性:
- 栈中数据按照后进先出(last-in, first-out, LIFO)的方式进栈和出栈的。
- 只能从栈顶(top)操作数据。
我们可以把它想象成几个盘子堆在弹簧上的场景。
![](https://i.loli.net/2019/05/21/5ce3dc0e1aab537652.jpg)
图4:栈的结构示意图
**入栈(push)**
![](https://i.loli.net/2019/05/21/5ce3ddf61390738627.jpg)
图5:入栈示意图
**出栈(pop)**
![](https://i.loli.net/2019/05/21/5ce3de567d21652302.jpg)
图6:出栈示意图
C++
bool isValid(string s) {
map<char,char> table={ {')', '('}, {']', '['}, {'}', '{'} };
if( s.size()== 0 )
return true;
stack<char> cStack;
for(int i = 0;i<s.size(); i++){
if(s[i] == '(' || s[i] == '[' || s[i] == '{')
cStack.push(s[i]);
else if(s[i] == ')' || s[i] == ']' || s[i] == '}'){
if(cStack.empty())
return false;
char popChar = cStack.top();
if(popChar == table[s[i]]){
cStack.pop();
continue;
}
else
return false;
}
}
if(cStack.empty())
return true;
return false;
}
Python
20. Valid Parentheses[E]有效的括号的更多相关文章
- 《LeetBook》leetcode题解(20):Valid Parentheses[E]——栈解决括号匹配问题
我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...
- [Leetcode][Python]20: Valid Parentheses
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 20: Valid Parentheseshttps://oj.leetcod ...
- leetcode 20. Valid Parentheses 、32. Longest Valid Parentheses 、
20. Valid Parentheses 错误解法: "[])"就会报错,没考虑到出现')'.']'.'}'时,stack为空的情况,这种情况也无法匹配 class Soluti ...
- LeetCode解题笔记 - 20. Valid Parentheses
这星期听别人说在做LeetCode,让他分享一题来看看.试了感觉挺有意思,可以培养自己的思路,还能方便的查看优秀的解决方案.准备自己也开始. 解决方案通常有多种多样,我觉得把自己的解决思路记录下来,阶 ...
- leetCode练题——20. Valid Parentheses
1.题目 20. Valid Parentheses——Easy Given a string containing just the characters '(', ')', '{', '}', ...
- 刷题20. Valid Parentheses
一.题目说明 这个题目是20. Valid Parentheses,简单来说就是括号匹配.在学数据结构的时候,用栈可以解决.题目难度是Medium. 二.我的解答 栈涉及的内容不多,push.pop. ...
- 20. Valid Parentheses【leetcode】
20. Valid Parentheses Given a string containing just the characters '(', ')', '{', '}', '[' and ']', ...
- [LeetCode] 20. Valid Parentheses 验证括号
Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...
- [leetcode]20. Valid Parentheses有效括号序列
Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...
随机推荐
- ArrayList 源码
1.ArrayList的类关系: 2.属性及方法 2.1 构造 三个构造方法分别对应: 通过传入初始化容器大小构造数组列表 ...
- C# 跨平台换行符 System.Environment.NewLine
C# 跨平台换行符 System.Environment.NewLine
- Eclipse之调试代码和返回
编写代码时,经常会遇到各种莫名其妙的问题,为了检测程序是哪里出现问题,我们通过断点调试来判断哪一步出错 一.断点 在需要断点的地方,在左侧双击鼠标设置断点,可设置多个 去掉断点:在断点上双击一下,没有 ...
- Pytorch实战(3)----分类
一.分类任务: 将以下两类分开. 创建数据代码: # make fake data n_data = torch.ones(100, 2) x0 = torch.normal(2*n_data, 1) ...
- eas之获取单据编码规则
//获取单据编码规则 /*** @Title: getNumber* @Description: TODO(获取单据编码规则)* <p>* @date 201 ...
- 优秀的web端 vue框架
之前得到消息vue在GitHub已经超过react,成为第一大框架,让我们来看看以vue为基础的开发框架有哪些? Element(start-28128) 饿了么前端推出的基于 Vue.js 2.0 ...
- top问题
1. 从10万个数中找10个最大的数 对于这种题目,最普通的想法是先对这10万个数进行排序,然后再选取数组中前10个数,即为最后的答案,排序算法的时间复杂度不下于O(N lgN).最好的方法是建立一个 ...
- javascript/jquery获取地址栏url参数的方法
1.jquery获取url window.location.href; 2.通过javascript是如何获取url中的某个参数 function getUrlParam(name) { var re ...
- Codeforces 816A/B
A. Karen and Morning 传送门:http://codeforces.com/contest/816/problem/A 水题,参考程序如下: #include <stdio.h ...
- jquery怎样获取多个复选框的值?
jquery的遍历方法可以获取复选框所欲的选中值 1 2 $("input:checkbox:checked").each(function(index,element)); ...