Leetcode 20. 有效的括号
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()" 输出:true
示例 2:
输入:s = "()[]{}" 输出:true
示例 3:
输入:s = "(]" 输出:false
解题思路:
遍历字符串,遇到左括号就入栈,遇到右括号就判断栈顶的左括号与其是否匹配
如果匹配则继续遍历,不匹配则返回 false。
最后,如果栈为空,则说明所有括号都匹配,返回 true;否则,返回 false。
代码实现:
方法一:
import java.util.Stack;
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
// 遇到左括号入栈
if (c == '(' || c == '[' || c == '{') {
stack.push(c);
} else {
// 如果栈为空,说明右括号没有对应的左括号,返回 false
if (stack.isEmpty()) {
return false;
}
// 弹出栈顶元素
char top = stack.pop();
if ((c == ')' && top != '(') || (c == ']' && top != '[') || (c == '}' && top != '{')) {
// 如果右括号与栈顶元素不匹配,返回 false
return false;
}
}
}
return stack.isEmpty(); // 栈为空表示所有括号都匹配,返回 true;否则返回 false
}
}
方法二:
import java.util.Stack;
class Solution {
public boolean isValid(String s) {
// 如果字符串为空,返回 false
if (s == null || s.length() == 0) {
return false;
}
Stack<Character> stack = new Stack();
for (int i = 0; i < s.length(); i++) {
// 遇到左括号 '(',将对应的右括号 ')' 入栈
if (s.charAt(i) == '(') {
stack.push(')');
// 遇到左括号 '[',将对应的右括号 ']' 入栈
} else if (s.charAt(i) == '[') {
stack.push(']');
// 遇到左括号 '{',将对应的右括号 '}' 入栈
} else if (s.charAt(i) == '{') {
stack.push('}');
} else if (stack.isEmpty() || s.charAt(i) != stack.peek()) {
// 如果栈为空或者当前字符不是栈顶元素的对应右括号,返回 false
return false;
} else {
// 当前字符是栈顶元素的对应右括号,将栈顶元素出栈
stack.pop();
}
}
// 栈为空表示所有括号都匹配,返回 true;否则返回 false
return stack.isEmpty();
}
}
评论区