题目
输入一串字符串,只包含’(’ , ‘)’ , ‘[’ , ‘]’ , ‘{’ , ‘}’ 这六种字符,现要判断字符串是否有效。有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例:
输入:
()[]{}
([)]
{[]}
输出:
true
false
true
思路
- 用栈解决即可,遍历字符串,每次遇到左括号就入栈,遇到右括号则出栈到栈顶弹出对应的左括号;
- 当最终遍历完成后,若栈不为空,则为false;栈为空,则为true。
代码
个人代码:
public boolean solute(String str){
if(str==null||str.length()==0)
return true;
Stack<Character> stack = new Stack<>();
char[] chars = str.toCharArray();
for(char c:chars){
if(c=='('||c=='{'||c=='[')
stack.push(c);
else {
if(stack.isEmpty()) return false;
else if(c==')'){
while (stack.peek()!='('){
if(!stack.isEmpty()){
stack.pop();
}
else
return false;
}
stack.pop();
}
else if(c==']'){
while (stack.peek()!='['){
if(!stack.isEmpty()){
stack.pop();
}
else
return false;
}
stack.pop();
}
else if(c=='}'){
while (stack.peek()!='{'){
if(!stack.isEmpty()){
stack.pop();
}
else
return false;
}
stack.pop();
}
}
}
return stack.isEmpty();
}
这个代码只有80%的通过率,暂时不知道原因。
LeetCode题解:
public boolean solute4(String str){
int len = str.length();
char[] stack = new char[len];
int p = -1;
for(char c: str.toCharArray()){
//如果遇到对应的字符则出栈
if(p>=0&&stack[p]==c){
stack[p] = '\0';
p--;
}
else{
//入栈操作
p++;
if(c == '(')
stack[p] = ')';
else if(c == '[')
stack[p] = ']';
else if(c == '{')
stack[p] = '}';
}
}
if (p>=0)
return false;
return true;
}
该题解使用数组来替代栈的操作,每当遇到左括号时就将对应右括号入栈,然后如果遇到右括号且栈顶元素与该右括号相同则出栈,否则栈顶指针+1。但是这个写法无法通过全部的示例,因为它只是将索引减小,但不对数组内的元素进行弹出操作,因此当示例为 “()))" 的形式时,会返回 true ,但结果是显而易见的 false。因此将其改回stack或者添加弹出操作。
数组形式:弹出之后清除索引数据
public boolean isValid(String s) {
int len = s.length();
char[] stack = new char[len];
int p = -1;
for(char c:s.toCharArray()){
if(p>=0&&stack[p]==c){
//弹出之后要清除数据
stack[p] = '\0';
p--;
}
else {
p++;
//如果符号不符则只索引+1但不引入字符,
//从而保证不会被清空,输出false
if(c=='(')
stack[p] = ')';
else if(c=='{')
stack[p] = '}';
else if(c=='[')
stack[p] = ']';
}
}
return p>=0?false:true;
}
用栈实现:
public boolean isValid2(String s) {
Stack<Character> stack = new Stack<>();
//防止出现空栈错误
stack.push('0');
for(char c:s.toCharArray()){
if(stack.peek()==c){
stack.pop();
}
else {
if(c=='(')
stack.push(')');
else if(c=='{')
stack.push('}');
else if(c=='[')
stack.push(']');
//不符合的就填入不可能被清空的值
else
stack.push('0');
}
}
//弹出初始的栈顶元素‘0’
stack.pop();
return stack.isEmpty();
}