题目:
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例:
代码:
- 解法一
class Solution {
public boolean isValid(String s) {
//使用栈实现
Stack<Character> stack = new Stack<Character>();
//遍历字符串中的每个字符
for (int i = 0; i < s.length(); i++) {
//如果为空 直接将字符进栈
if (stack.isEmpty()) {
stack.push(s.charAt(i));
} else {
if (stack.peek() - s.charAt(i) == -1 || stack.peek() - s.charAt(i) == -2) { //如果两个相匹配 弹栈()差1 {} []差2
stack.pop();
} else { //如果两个不匹配 进栈
stack.push(s.charAt(i));
}
}
}
if (stack.isEmpty()) { //判断栈是否为空 (如果全部匹配栈为空)
return true;
} else {
return false;
}
}
}
- 解法二
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
//foreach遍历
for (char c : s.toCharArray()) {
if (c=='(' || c=='[' || c=='{') { //如果为( { [则进栈
stack.push(c);
} else {
if (stack.empty()) return false; //栈为空 所以返回false
if (c==')' && stack.pop()!='(') return false; //有) 但没有左边的相匹配 所以返回false
if (c==']' && stack.pop()!='[') return false; //有]但没有左边的相匹配 所以返回false
if (c=='}' && stack.pop()!='{') return false; //有}但没有左边的相匹配 所以返回false
}
}
return stack.empty(); //根据else中栈是否为空的情况返回 true/false
}
}
- 别人的代码
class Solution {
public boolean isValid(String s) {
boolean result = false;
String[] stack = new String[s.length()];
int r = 0;
if(s.length() == 0) return true;
for (int i = 0; i <s.length(); i ++){
switch (s.substring(i,i+1)){
case "(":
stack[r] = "(";
r++;
break;
case "[":
stack[r] = "[";
r++;
break;
case "{":
stack[r] = "{";
r++;
break;
case ")":
if (r == 0) return false;
if(stack[r-1] != "(")
return false;
else r--;
break;
case "]":
if (r == 0) return false;
if(stack[r-1] != "[")
return false;
else r--;
break;
case "}":
if (r == 0) return false;
if(stack[r-1] != "{")
return false;
else r--;
break;
}
}
if(r == 0) return true;
else return false;
}
}