Leetcode-20有效的括号(java实现)

Leetcode-20有效的括号(java实现)

题目:

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

有效字符串需满足:

1. 左括号必须用相同类型的右括号闭合。
2. 左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

示例 1:

输入: "()"
输出: true

示例 2:

输入: "()[]{}"
输出: true

示例 3:

输入: "(]"
输出: false

分析:

  • 括号是有key-value 关系的
  • 括号的关闭顺序是打开顺序的逆序,如(【】)
  • 空字符串是有效的括号,则说明我们需要注意判空处理
  • 综上所述:我们利用栈就行完成
    1. key-value关系
    2. 关闭顺序是打开顺序的逆序

我们利用java中的LinkedList当作集合容器,通过代码理解一下栈的思想。

解答:

package com.yang.leetcode.classic;

import java.util.LinkedList;

/**
 * @author: fudy
 * @date: 2020/9/14 上午 08:31
 * @Decription: leetcode—No20 =(有效括号)
 **/
public class ValidBrackets {
    
    
    public static void main(String[] args) {
    
    
        // 测试
        System.out.println(isValid("(){()}{[()]}}"));
        System.out.println(isValid("(){()}{[()]}"));
        System.out.println(isValid("((([]{})))"));
        System.out.println(isValid(""));
    }
    private static  boolean isValid(String s){
    
    
        // 使用链表完成类似与栈的数据结构
        LinkedList<Character> linkedList = new LinkedList<Character>();
        // 如果字符串为空跳过循环
        for (char c : s.toCharArray()) {
    
    
            // 如果是左符号,则压入栈右符号,保证key-value关系
            if (c == '{') linkedList.push('}');
            else if (c == '[') linkedList.push(']');
            else if (c == '(') linkedList.push(')');
            // 如果不是左符号,则判断是不是右括号,因为有顺序性我们必须出栈的右符号和我们栈顶的右符号相等
            // 如果链表为空,则左符号少了,如果不相等,则符号交叉
            else if (linkedList.isEmpty() || c != linkedList.pop()) return false;
        }
        // 如果链表还存在值,则右符号少了
        // 如果链表为空说明 1.这个字符串是有效的括号 2.这个字符串为空
        return linkedList.isEmpty();
    }
}

画图分析

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44112474/article/details/108577429