简介
题目链接:https://leetcode.cn/problems/valid-parentheses/description/
解决方式:字符串 + 栈 / 栈、映射
栈
实现思路:
迭代字符,遇到左括号则放入栈中否则根据当前的右括号去栈中匹配。栈顶元素若不是右括号对应的左括号就证明包含无效括号。迭代结束后栈中应无数据,有则证明左括号多了。
java
class Solution {
public boolean isValid(String s) {
int n = s.length();
// 转换为字符数组
char[] ch = s.toCharArray();
// 栈
Stack<Character> stack = new Stack<>();
// 循环
for(int i = 0; i < n; i++){
// 左括号加入栈
if(ch[i] == '(' || ch[i] == '{' || ch[i] == '[') {
stack.add(ch[i]);
}else{
// 右括号匹配
if(stack.isEmpty()) {
return false;
}
if(ch[i] == ')' && stack.pop() != '(') {
return false;
}else if(ch[i] == '}' && stack.pop() != '{') {
return false;
}else if(ch[i] == ']' && stack.pop() != '[') {
return false;
}
}
}
// 循环结束栈中应无数据,若有则有无效括号
return stack.size() > 0 ? false : true;
}
}
栈、映射
实现思路:
这是另一种写法,将左右括号的匹配加入映射而非直接硬编码。这种写法时间复杂度较高。
java
class Solution {
public boolean isValid(String s) {
// 边界处理
if(s == "" || s.length() % 2 != 0){
return false;
}
// 有效括号映射
Map<Character, Character> pairs = new HashMap<>();
pairs.put(')', '(');
pairs.put(']', '[');
pairs.put('}', '{');
// 栈
Deque<Character> stack = new ArrayDeque<>();
// 循环,遇到左括号入栈,遇到右括号则匹配栈中的左括号
for(int i = 0; i < s.length(); i++){
char c = s.charAt(i);
if(pairs.containsKey(c)){
// 栈为空 或 栈顶不匹配 -> 无效
if(stack.isEmpty() || stack.pop() != pairs.get(c)){
return false;
}
}else{
// 左括号直接入栈
stack.push(c);
}
}
// 所有字符处理完后,栈应为空。不为空则有无效括号。
return stack.isEmpty();
}
}