LeetCode20 有效的括号
题目
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
方法
1.辅助栈法
用hashmap保存模板,然后依次放入栈中,用栈判断顺序
- 时间复杂度:O(n)
- 空间复杂度:O(n+m),m为模板数量
Java版本:
class Solution {
public boolean isValid(String s) {
if(s.length()<=0){
return true;
}
Map map = new HashMap();
map.put('}','{');
map.put(']','[');
map.put(')','(');
Stack stack = new Stack();
for(char c:s.toCharArray()){
if(!stack.isEmpty()&&map.get(c)==stack.peek()){
stack.pop();
}else{
stack.push(c);
}
}
if(stack.isEmpty()){
return true;
}
return false;
}
}
Js版本:
var isValid = function(s) {
const n = s.length;
if(n%2===1) return false;
const map = new Map([
[")","("],
["]","["],
["}","{"]
]);
const stack = [];
for(let ch of s){
if(map.has(ch)){
if(!stack.length||stack[stack.length-1]!==map.get(ch)){
return false;
}
stack.pop();
}else{
stack.push(ch);
}
}
return !stack.length;
};
2. 替换法
依次替换掉字符串中的()、{}和[]
- 时间复杂度:O(n)
- 空间复杂度:O(1)
Java版本:
class Solution {
public boolean isValid(String s) {
int length = s.length() / 2;
for (int i = 0; i < length; i++) {
s = s.replace("()", "").replace("{}", "").replace("[]", "");
}
return s.length() == 0;
}
}
Js版本:
var isValid = function(s) {
const n = s.length /2;
for(let i=0;i<n;i++){
s = s.replace("()","").replace("{}","").replace("[]","");
}
return !s.length;
};