题目描述
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例
输入: “()”
输出: true
输入: “()[]{}”
输出: true
输入: “(]”
输出: false
输入: “([)]”
输出: false
输入: “{[]}”
输出: true
解题思路
1.利用栈
java代码如下:
import java.util.Stack;
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
char cur;
for (int i = 0; i < s.length(); i++) {
cur = s.charAt(i);
if(cur == '(' || cur == '{' || cur == '['){
stack.push(cur);
}else {
// ())的情况
if(stack.isEmpty()){
return false;
}
if(cur == ')' && stack.peek() != '('){
return false;
}
if(cur == '}' && stack.peek() != '{'){
return false;
}
if(cur == ']' && stack.peek() != '['){
return false;
}
stack.pop();
}
}
return stack.isEmpty(); //防止({[]}的情况
}
}
运行结果如下:

2.另一种思路不过效率不太高
java代码如下:
public boolean isValid(String s) {
int n = s.length();
for(int i = 0; i < n/2; i++){ //最多比较n/2次
s = s.replace("()", "");
s = s.replace("{}", "");
s = s.replace("[]", "");
}
return s.length() == 0;
}
运行结果如下:

3.参考解法
建立哈希表构建左右括号对应关系:key括号,value 右括号;这样查询 2 个括号是否对应只需 O(1) 时间复杂度;建立栈 stack,遍历字符串 s 即可
java代码如下:
class Solution {
private HashMap<Character, Character> mappings;
//初始化哈希表
public Solution() {
this.mappings = new HashMap<Character, Character>();
this.mappings.put(')', '(');
this.mappings.put('}', '{');
this.mappings.put(']', '[');
}
public boolean isValid(String s) {
Stack<Character> stack = new Stack<Character>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (this.mappings.containsKey(c)) {
char topElement = stack.empty() ? '#' : stack.pop();//类似于())的特殊情况
if (topElement != this.mappings.get(c)) {
return false;
}
} else {
stack.push(c);
}
}
return stack.isEmpty(); //类似于(()的特殊情况
}
}
运行结果如下:

本文深入探讨了括号匹配的有效性判断算法,提供了三种不同思路的解决方案,包括使用栈、字符串替换以及构建哈希表的方法,详细展示了每种方法的Java实现代码。
1158

被折叠的 条评论
为什么被折叠?



