20.有效的括号
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = “()” 输出:true 示例 2:
输入:s = “()[]{}” 输出:true 示例 3:
输入:s = “(]” 输出:false
提示:
1 <= s.length <= 104 s 仅由括号 ‘()[]{}’ 组成
思路
- 构建一个哈希表,映射左右括号
- 初始化一个栈并且栈内要初始化一个
‘?’
防止stack为空时无法执行stack.pop()
- 将字符串s 初始化为 s数组
- 如果 s数组中的字符可以和 stack 一左一右对应则 出栈
- 如果不能对应则直接 false
- 最后判断是否有剩余的括号即判断stack的长度是否为1
import java.security.PublicKey;
class Solution {
// 构建哈希表,表示左右括号的对应关系
// 双括号初始化,是一种在 Java 中的语法构造,可以在实例化对象时添加额外的代码块
private static final Map<Character, Character> map = new HashMap<Character, Character>() {
{
put('{', '}');
put('[', ']');
put('(', ')');
put('?', '?');
}
};
// 如果长度不匹配直接pass
public boolean isValid(String s) {
if (s.length() > 0 && !map.containsKey(s.charAt(0))) {
return false;
}
/// 创建了一个名为stack的LinkedList对象
// 使用双括号初始化将‘?’初始化在stack中
//栈为空时,stack.pop()会出错,所以先加上一个'?'
LinkedList<Character> stack = new LinkedList<Character>() {
{
add('?');
}
};
for (Character c : s.toCharArray()) {
if (map.containsKey(c)) {
stack.addLast(c);
} else if (map.get(stack.removeLast()) != c) {
return false;
}
}
//最后判断stack的大小是否为1,因为初始化时有一个‘?’
return stack.size() == 1;
}
}
双括号初始化
双括号初始化(Double Brace Initialization)是一种在 Java 中的语法构造,可以在实例化对象时添加额外的代码块。它使用了匿名内部类的方式来实现。
双括号初始化的语法如下:
new ClassOrInterface() {{
// 初始化代码
// 可以在这里调用类的方法、添加元素等
}}
在内层的大括号中,可以编写初始化代码,包括调用类的方法、添加元素等。这种写法可以用于初始化集合、设置初始值等场景。
下面是一个具体的例子,展示了如何使用双括号初始化来创建一个包含初始元素的 ArrayList:
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<String>() {{
add("Hello");
add("World");
}};
System.out.println("List: " + list);
}
}
输出:
List: [Hello, World]