文章目录
1、LeetCode 链接
plain
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([])"
输出:true
示例 5:
输入:s = "([)]"
输出:false
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
2、个人写法
- 思路:有效字符串从左到右遇到的第一个右括号,它的上一个字符肯定是对应的左括号
- 时间复杂度:O(N)
- 空间复杂度:O(N)
plain
class Solution {
public boolean isValid(String s) {
int length = s.length();
Stack<Character> stack = new Stack();
for (int i = 0; i < length; i++) {
char c = s.charAt(i);
if (c == '(' || c == '[' || c == '{') {
stack.add(c);
} else {
if (stack.empty()) {
return false;
}
switch (c) {
case ')':
if (stack.peek() == '(') {
stack.pop();
} else {
return false;
}
break;
case ']':
if (stack.peek() == '[') {
stack.pop();
} else {
return false;
}
break;
case '}':
if (stack.peek() == '{') {
stack.pop();
} else {
return false;
}
break;
}
}
}
return stack.size() == 0;
}
}
3、官方写法
- 思路:在上述基础上做了点优化,避免重复判断,复杂度没变
- 时间复杂度:O(N)
- 空间复杂度:O(N)
plain
class Solution {
public boolean isValid(String s) {
int length = s.length();
Stack<Character> stack = new Stack();
Map<Character, Character> map = new HashMap();
map.put(')', '(');
map.put(']', '[');
map.put('}', '{');
for (int i = 0; i < length; i++) {
char c = s.charAt(i);
if (map.containsKey(c)) {
if (stack.empty() || stack.peek() != map.get(c)) {
return false;
}
stack.pop();
} else {
stack.add(c);
}
}
return stack.size() == 0;
}
}