题目
Given a string containing just the characters '(',')','[',']','{' and ‘}’,determine if the input string is valid.
An input string is valid if:python
- 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:trueide
思路
leetcode上的解答是这样的:
先考虑简单的状况:只有一种括号.net

图1:只有一种括号
定义一个计数器left,若是咱们遇到一个开括号,则计数器left加1;若是遇到一个闭括号,此时有两种状况,一是当前left=0,这说明没有配对的开括号,表达式无效;二是left>0,说明还有没配对的开括号,left--。 可是实际状况不止一种括号,可是咱们发现,为了保证表达式的每个子表达式都是也是有效的,每个闭括号老是与左起最近的开括号是匹配的,如图2。

图2:多个括号的状况
这个时候就要用到栈。在表示问题的递归结构时,因为咱们不清楚总体的结构,没法从里到外的解决问题,此时栈能够帮助咱们递归地解决问题,从外到内地解决问题。 因而本题的解题思路以下: * 1.初始化一个堆栈,并初始化一个映射表(用来处理不一样种类的括号); * 2.循环处理全部括号 * 若是是开括号,则push进栈便可; * 若是是闭括号,那么就须要检查栈顶的元素,若是栈顶的开括号与当前的闭括号匹配(经过查找创建的映射表匹配),则pop出栈;若是不匹配,说明表达式无效;
- 3.当处理完全部括号后,若是栈中还有元素,说明表达式无效。
就想在玩一个消消乐,只有当开括号和闭括号匹配的时候才能消掉这一对括号。
Tips
栈
一种线性存储表。它有如下两种特性:3d
- 栈中数据按照后进先出(last-in, first-out, LIFO)的方式进栈和出栈的。
- 只能从栈顶(top)操做数据。
咱们能够把它想象成几个盘子堆在弹簧上的场景。code

图4:栈的结构示意图
**入栈(push)**

图5:入栈示意图
**出栈(pop)**

图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