有效的括号
题目描述
给定一个只包括 '(',')','{','}','','' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
题目示例
java
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([])"
输出:true
示例 5:
输入:s = "([)]"
输出:false
算法实现
看了下别人的算法很巧妙,用replace("()","")循环替换,直到字符串长度是0则满足要求。
我用了Stack数据结构完成题解,思路很简单就是当遇到左括号的时候就入栈,当遇到右括号的时候将当前栈顶的元素与右括号对比,如果比对失败说明不符合要求。整体代码如下:
java
public boolean isValid(String s) {
if (s == null || s.isEmpty()) {
return false;
}
int length = s.length();
if (length % 2 != 0) {// 奇数直接返回false
return false;
}
char[] chars = s.toCharArray();
Stack stack = new Stack();
for(int i=0;i<length;i++) {
char c = chars[i];
if(c=='('||c=='['||c=='{') {
stack.add(c);
}else {//处理 )]}
if(stack.isEmpty()) {
return false;
}
char left = (char) stack.pop();
boolean isValid = (c==')'&&left=='(')
||(c==']'&&left=='[')||
(c=='}'&&left=='{');
if(!isValid) {
return false;
}
}
}//end for
return stack.isEmpty();
}