题目信息
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例1:
输入:s = "()"
输出:true
示例2:
输入:s = "()[]{}"
输出:true
示例3:
输入:s = "(]"
输出:false
示例4:
输入:s = "([)]"
输出:false
解题思路
题目的意思我给大家翻译翻译:
把括号之间的匹配想象成找对象,左括号(不管它是大括号还是小括号)看成是女生,右括号看成是男生,因为男生需要主动去匹配左括号。而找对象还要讲究看对眼、有感觉。还要找离自己最近的,没有对象的女生(未匹配的左括号)。如果恰好右括号匹配了一个左括号,那么他们就算是成了,轮到下一个男生。直到所有男生都找完了。这时候如果还有剩下的人,不管是男是女。都是剩下了,就不够皆大欢喜。需要返回false。如果没有剩下的,每个人都找到自己的心上人了,那就返回true。
还有一种情况,就是上面的示例4,')'离得最近的左括号是'['。
这个男生喜欢的是黑长直,但是他最近的女生是短发。
这哥们心态炸了,不谈了,心一横,
那就都别谈了。就要返回false了。
我们来看看ASCII码对照表,发现括号的ASCII值要么是相差1,要么是相差2.这个信息后面会用到。
具体到代码上,可以用栈来解决。遍历题目给的字符串,如果是左括号(女生)那就放到栈里,如果是右括号,那就是男生了。看看和栈顶的括号匹配不,如果匹配了那就弹出出栈当前栈顶的元素,如果不匹配就返回false。到最后查看栈是不是空的,如果是空的就皆大欢喜,返回true,不为空的话就返回false。回到上面ASCII表中,如果两个括号能匹配,那么他们的ASCII相差一定不大于2。知道这些就可以写代码了。
实现代码:
class Solution {
public boolean isValid(String s) {
Stack<Character> stack=new Stack<> ();
for(int i=0;i<s.length ();i++){
char ch=s.charAt (i);
if(ch=='(' || ch=='{' || ch=='['){
stack.add (ch);
}else {
if(!stack.empty () && Math.abs (stack.peek ()-ch)<=2){
stack.pop ();
}else {
return false;
}
}
}
return stack.isEmpty ();
}
}