20. 有效的括号
20. Valid Parentheses
题目:
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
题解:
主要使用栈。遇到左括号'(', '[', '{'时,直接入栈,遇到右括号‘)’, ']', '}'时,则与栈顶元素比较,如果是匹配的,则直接将栈顶元素出栈,如果栈为空或者不匹配,则直接返回False。括号字符串遍历结束后,还需要检查栈是否为空,为空才表示是一个合法的括号组合。
技巧:
使用map,以右括号为key,左括号为value,可以减少代码量。
C++
class Solution {
public:
bool isValid(string s) {
stack<char> st;
unordered_map<char, char> map;//给括号建立map
map[')'] = '(';
map['}'] = '{';
map[']'] = '[';
for(auto c : s){
switch(c){
case '('://左括号直接入栈
case '[':
case '{':
st.push(c);
break;
case ')':
case ']':
case '}':
if(st.empty() || st.top() != map[c]){//栈为空或者与栈顶不匹配,返回false
return false;
}
st.pop();
break;
}
}
return st.empty();//栈为空则是合法的
}
};
Java
class Solution {
public boolean isValid(String s) {
Stack<Character> st = new Stack<Character>();
HashMap<Character, Character> map = new HashMap<Character, Character>(){{
put( ')', '(');
put( ']', '[');
put( '}', '{');
}};
char chrs[] = s.toCharArray();
for(Character c : chrs) {
switch(c) {
case '('://处理左括号
case '[':
case '{':
st.push(c);
break;
case ')'://右括号
case ']':
case '}':
if(st.empty() || st.pop() != map.get(c)) {//栈为空或者栈顶元素不匹配,返回false
return false;
}
break;
}
}
return st.empty();//栈为空则合法
}
}
Python
class Solution(object):
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
st = []
dic = {')':'(', '}':'{', ']':'['} # 括号的map
for c in s:
if c == '(' or c == '[' or c == '{':# 左括号
st.append(c)
elif c == ']' or c == ')' or c == '}':# 右括号
if len(st) == 0 or st.pop() != dic[c]: # 栈为空或者栈顶不匹配,返回false
return False
return len(st) == 0

本文介绍了一种使用栈和映射表的方法来判断一个包含括号的字符串是否有效。通过遍历字符串,利用栈记录左括号并在遇到匹配的右括号时进行消除,最终实现对括号的有效性验证。
635





