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.
一个字符串有效:
1、开括号必须被同类型的闭括号括上
2、开括号必须按照正确的顺序被闭括号括上
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
Solution:
Python
class Solution:
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
stack = []
mapping = {')':'(','}':'{',']':'['} #创建一个括号对应字典
for char in s:
if char in mapping.values(): #碰到左括号,就压入栈中
stack.append(char)
elif char in mapping.keys(): #碰到右括号,则将它对应的左括号与字符串上一位字符进行比较,也就是stack.pop()出的元素
if stack == [] or mapping[char] != stack.pop(): #这里的stack == [] 是为了防止字符串只有一个字符的情形
return False
else: #如果还有非字典中的字符,则返回False
return False
return stack == [] #最后检查字符串是否有多余元素,没有多余元素则栈为空,返回True,否则返回False
C++的思路和Python是一样的
C++
#include <stack>
class Solution {
public:
bool isValid(string s) {
stack<char> stk;
for (auto c : s){
switch (c){
case '(':
case '[':
case '{':stk.push(c); break;
case ')':
if(stk.empty() || '(' != stk.top()){
return false;
}
else{
stk.pop();
};
break;
case ']':
if(stk.empty() || '[' != stk.top()){
return false;
}
else{
stk.pop();
};
break;
case '}':
if(stk.empty() || '{' != stk.top()){
return false;
}
else{
stk.pop();
};
break;
default: ;
}
}
return stk.empty();
}
};
//更简便的写法是:
#include <stack>
class Solution{
public:
bool isValid(string s){
stack <char> stk;
for (auto c : s){
switch(c){
case '(':stk.push(')');break;
case '[':stk.push(']');break;
case '{':stk.push('}');break;
default:
if(stk.empty() || c != stk.top()){
return false;
}
else{
stk.pop();
}
}
}
return stk.empty();
}
};