20.有效的括号

20.有效的括号

给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = “()” 输出:true 示例 2:

输入:s = “()[]{}” 输出:true 示例 3:

输入:s = “(]” 输出:false

提示:

1 <= s.length <= 104 s 仅由括号 ‘()[]{}’ 组成


思路

  1. 构建一个哈希表,映射左右括号
  2. 初始化一个栈并且栈内要初始化一个‘?’防止stack为空时无法执行stack.pop()
  3. 将字符串s 初始化为 s数组
  4. 如果 s数组中的字符可以和 stack 一左一右对应则 出栈
  5. 如果不能对应则直接 false
  6. 最后判断是否有剩余的括号即判断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]

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值