判断括号是否匹配
题目:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
链接:原文链接
解题思路:在求解该题目时需要确定的一点是,如果一个字符串是可以相互匹配的,则其子串一定是相互匹配的。这里利用栈对该题目进行求解。首先如果出现的是左括号,则将其放入堆栈中,如果是右括号则此时即开始做匹配,弹出栈顶在字符,若当前栈顶的字符与当前字符相互匹配,则将此字符从栈中弹出,否则直接返回false。说明此时的字符是不能匹配的,既然内部的字符都不能实现,此时也就没有必要在进行比较了,直接返回false。
代码如下:
///充分利用栈的思想进行求解,将遇到的每个字符加入到栈中,如果新加入的字符与栈中的字符相互匹配,则将这一对字符弹出
public static boolean isValid(String s) /////
{
HashMap<Character,Character> map = new HashMap<>();
map.put('}', '{');
map.put(']', '[');
map.put(')', '(');
Stack<Character> stack = new Stack<>();
for(int i=0;i<s.length();i++)
{
char tmp = s.charAt(i);////获得当前字符
if(map.containsKey(tmp))////若存在map中映射的字符说明就要进行匹配环节了
{
char top = stack.isEmpty() ? '#' : stack.pop();////获得当前栈顶的字符,若当前栈为空则返回空字符串
if(top!=map.get(tmp)) ////判断当前字符是否匹配
{
return false;
}
}
////若不存在则直接将当前字符加入到栈中
else
{
stack.add(tmp);
}
}
return stack.isEmpty();////判断当前栈是否为空,若为空说明当前字符均获得了正确的匹配,不为空说明当前字符还有没被匹配的字符
}