一、题目描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、运行结果
三、解题思路
设置一个哈希表保存每种匹配的括号,以右括号未key,左括号为value(这样设置是为了方便后面查找),设置一个栈用于保存所有的左括号;
遍历括号串中的每一个括号,如果当前括号是左括号(哈希表中不包含该键),则将其放入到栈中,如果当前括号是右括号,则取出哈希表中与该右括号(key)对应的左括号(value),如果此时栈为空或栈顶的左括号与从哈希表中取出的左括号不相同,则为不匹配,如果相同,则弹出栈顶元素;遍历完整个括号串之后,如果栈为空,则表示所有的括号是匹配的,如果栈不为空,则表示有多出的左括号,是不匹配的。
四、AC代码
class Solution {
public boolean isValid(String s) {
int len = s.length();
if(len == 0) return true;
Map<Character, Character> kMap = new HashMap<>();
kMap.put(')', '(');
kMap.put(']', '[');
kMap.put('}', '{');
Stack<Character> st = new Stack<>(); //保存匹配括号的栈
for(int i=0; i<len; i++){
char c = s.charAt(i);
if(!kMap.containsKey(c)) //左括号入栈
st.push(c);
else {
if(st.isEmpty() || st.peek()!=kMap.get(c)) //栈为空或栈顶括号不匹配
return false;
st.pop(); //栈顶左括号匹配,出栈
}
}
return st.isEmpty(); //栈空则为匹配,不空则为不匹配
}
}