Given a string containing just the characters '('
, ')'
, '{'
, '}'
, '['
and ']'
, determine if the input string is valid.
The brackets must close in the correct order, "()"
and "()[]{}"
are all valid but "(]"
and "([)]"
are not.
Subscribe to see which companies asked this question.
问题描述:给定一个字符串,该字符串只包含‘(’,')','{','}',']',']',判断该字符串是否有效,即括号匹配问题。
分析:可利用栈的知识来解决这个问题。当字符串长度小于2,则不是有效括号,直接返回false;否则循环字符串s逐个获得字符:
(a)如果字符ch是‘(’,‘[’或‘{’,则将该字符压入栈stack中;
(b)如果字符ch是‘)’,‘]’或‘}’,判断栈中是否为空且栈顶元素是对于的‘(’,‘[’或‘{’。若满足这两个条件则将栈顶元素出栈,继续循环匹配;若不满足其中任意一个则返回false,匹配失败。
循环结束后判断栈stack中是否为空,为空返回true,否则返回false。
注:
pop()函数和peek()函数的区别:pop()函数和peek()函数都是返回栈顶元素的值,但pop()函数会删除栈顶元素,而peek()函数不会移除栈顶元素。
Java栈stack类继承Vector类,除了继承Vector类的所有方法,自己定义的一些方法如下图所示:
public class Solution {
public boolean isValid(String s) {
if(s.length()<2)
return false;
char ch;
Stack stack = new Stack();
for(int i=0;i<s.length();i++){
ch = s.charAt(i);
switch(ch){
case '(':{
stack.push(ch);
break;
}
case ')':{
if(!stack.isEmpty() && (char)stack.peek()=='('){
stack.pop();
break;
}else
return false;
}
case '[':{
stack.push(ch);
break;
}
case ']':{
if(!stack.isEmpty() && (char)stack.peek()=='['){
stack.pop();
break;
}else
return false;
}
case '{':{
stack.push(ch);
break;
}
case '}':{
if(!stack.isEmpty() && (char)stack.peek()=='{'){
stack.pop();
break;
}else
return false;
}
}
}
return stack.isEmpty();
}
}