题目
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([])"
输出:true
示例 5:
输入:s = "([)]"
输出:false
题解
java
class Solution {
private static final Map<Character,Character> map = new HashMap<Character,Character>(){{
put('{','}'); put('[',']'); put('(',')'); put('?','?');
}};
public boolean isValid(String s) {
if(s.length() > 0 && !map.containsKey(s.charAt(0))) return false;
LinkedList<Character> stack = new LinkedList<Character>() {{ add('?'); }};
for(Character c : s.toCharArray()){
if(map.containsKey(c)) stack.addLast(c);
else if(map.get(stack.removeLast()) != c) return false;
}
return stack.size() == 1;
}
}
解析
java
class Solution {
private static final Map<Character,Character> map = new HashMap<Character,Character>(){{
put('{','}'); put('[',']'); put('(',')'); put('?','?'); //这行代码初始化了一个HashMap,用于存储左括号及其对应的右括号。
}};
public boolean isValid(String s) { //这是一个名为isValid的方法,用于判断输入字符串s是否含有有效的一组括号。
if(s.length() > 0 && !map.containsKey(s.charAt(0))) return false; //这行代码检查s的第一个元素是否不是左括号,如果是则返回false。
LinkedList<Character> stack = new LinkedList<Character>() {{ add('?'); }}; //这是一个链表stack,用于存储字符串中的括号。初始化时加了一个虚拟的元素'?'。
for(Character c : s.toCharArray()) { //这行代码将输入字符串s转化为字符数组进行逐个遍历。
if(map.containsKey(c)) stack.addLast(c); //如果当前字符是一个左括号,将其添加到stack的末尾。
else if(map.get(stack.removeLast()) != c) return false; //如果是右括号,则从栈中弹出最后一个元素并与之比较;如果不匹配返回false。
}
return stack.size() == 1; //在遍历结束后,这行代码判断stack的大小是否为1。如果是则表示所有的左括号都找到了自己的右括号,因此s是一个有效的字符串,方法应返回true;如果不是则表示还有未匹配的左括号,所以s不是一个有效的字符串,方法应返回false。
}
}