题目:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
输入: "()[]{}"
输出: true
输入: "([)]"
输出: false
分析:
如果只是一组括号的话可以,用left进行标记
(((((()))))) -- VALID
()()()() -- VALID
(((((((() -- INVALID
((()(()))) -- VALID
我们从表达式的左侧开始,每次只处理一个括号。
假设我们遇到一个开括号(即 (),表达式是否无效取决于在该表达式的其余部分的某处是否有相匹配的闭括号(即 ))。此时,我们只是增加计数器的值保持跟踪现在为止开括号的数目。left += 1
如果我们遇到一个闭括号,这可能意味着这样两种情况:
此闭括号没有与与之对应的开括号,在这种情况下,我们的表达式无效。当 left == 0,也就是没有未配对的左括号可用时就是这种情况。
我们有一些未配对的开括号可以与该闭括号配对。当 left > 0,也就是有未配对的左括号可用时就是这种情况。
如果我们在 left == 0 时遇到一个闭括号(例如 )),那么当前的表达式无效。否则,我们会减少 left 的值,也就是减少了可用的未配对的左括号的数量。
继续处理字符串,直到处理完所有括号。
如果最后我们仍然有未配对的左括号,这意味着表达式无效。
正常三组括号情况:首先括号成对出现可以用hashmap来定义,
然后对于有三组括号,可以用栈进行操作,,如果不是右括号入栈,是右括号,在判断是否是hashmap中的,然后在判断是否与之对应,对应的话,出栈,否则报错。
class Solution {
private HashMap<Character, Character> hashmap;
public Solution(){
hashmap = new HashMap<Character, Character>();
hashmap.put(')', '(');
hashmap.put('}', '{');
hashmap.put(']', '[');
}
public boolean isValid(String s) {
Stack<Character> stack = new Stack<Character>();
for(int i=0;i<s.length();i++){
char c = s.charAt(i);
//判断第n个字符是否符合hashmap中传入的右括号(key)
if(hashmap.containsKey(c)){
//栈为空传入#,否则弹出栈顶元素
char topElement = stack.isEmpty()? '#' : stack.pop();
//如果此括号的映射与堆栈的顶部元素不匹配,返回错
if(topElement != hashmap.get(c)){
return false;
}
}else{
stack.push(c);
}
}
return stack.isEmpty();
}
}