【经典面试题-LeetCode20:有效的括号(附Java代码)】

一、题目描述

1.题目内容

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

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

原题链接:https://leetcode.cn/problems/valid-parentheses/

另外两个条件比较好理解,这里说一下第二条,此条件是指不同类型的左括号哪个在后,哪个就应该先闭合,也就是对应右括号应该先出现。比如字符串s= { [ } ]就不是一个有效的字符串,因为中括号[应该先闭合,即]应该在}的前面

2.样例

在这里插入图片描述

二、解决方案

这道题主要涉及的知识点是:栈结构
栈的特点:先进后出

1.算法流程

这种题直观解决方案就是使用栈结构,具体实现我们需要考虑综合的边界条件。
具体地,算法流程如下:

  • 判断字符串长度是否为偶数,如果是奇数说明字符串无效,直接返回false(因为所有括号左右一一对应,所以有效字符串的基础条件就是len(s)%2=0)
  • 创建不同类型括号对之间的映射关系,如’[‘与’]'对应(Java中使用Map实现)
  • 初始化栈,用于后续左括号入栈,完成判断过程
  • 从头遍历输入字符串:
    (1)判断栈是否为空,若为空,则直接将当前字符入栈;
    (2)判断栈顶元素是否为右括号,若为右括号说明字符串无效,跳出循环,此时栈一定不为空(起码会包含一个右括号);
    (3)判断栈顶元素topChar是否和字符串中当前字符currentChar是否配对闭合:1)如果配对,则栈顶元素出栈;2)如果不配对,则将当前字符入栈;3)字符串指针后移一位;
  • 遍历结束以后,判断栈是否为空,若栈为空则说明输入字符串中的左右括号一一对应,字符串有效

分别举一个有效字符串、无效字符串例子,展示其判断过程:
(1)有效字符串:()[]
在这里插入图片描述

(2)无效字符串:[{]}
在这里插入图片描述

2.Java代码

1)核心代码

    public boolean isValid(String s) {
        int len=s.length();
        // 判断字符串长度是否为偶数
        if (len%2!=0){
            return false;
        }
        // 创建括号对之间的映射关系,便于遍历字符串时的闭合判断
        Map<Character,Character> bracketsRelation = new HashMap<Character,Character>();
        bracketsRelation.put('{','}');
        bracketsRelation.put('(',')');
        bracketsRelation.put('[',']');
		// 借助栈结构完成判断过程
        Stack<Character> strStack=new Stack<Character>();

        int i=0;  // 指向字符串中的元素,用于遍历字符串
        while (i<len){
            char currentChar = s.charAt(i);  // 获取当前字符
            if (strStack.isEmpty()){  // 用于第一次入栈,以及后续括号配对导致空栈的情况
                strStack.push(currentChar);
                i++;
                continue;
            }
            char topChar=strStack.peek();  // 获取栈顶元素

            if(topChar==')'||topChar=='}'||topChar==']'){  //如果栈顶元素为右括号则说明字符串无效
                break;
            }
			
			// 判断当前字符是否与栈顶元素配对
            if (currentChar!=bracketsRelation.get(topChar)) {
                strStack.push(currentChar);
            }else {
                strStack.pop();
            }
            i++;
        }
		
		// 若栈为空则说明字符串有效,反之字符串无效
        return strStack.isEmpty();
    }

在这里插入图片描述

2)完整测试代码

package com.north.leetcode;
/*
* LeetCode20:有效的括号
* */

import java.util.HashMap;
import java.util.Map;
import java.util.Stack;

public class ValidParentheses {
    public static void main(String[] args) {
//        String s= "()[]{}";
//        String s= "()";
//        String s= "(]";
//        String s= "{[]}";
        String s= "([)]";
        System.out.println(new Solution1().isValid(s));
    }
}

class Solution1 {
    public boolean isValid(String s) {
        int len=s.length();
        if (len%2!=0){
            return false;
        }
        Map<Character,Character> bracketsRelation = new HashMap<Character,Character>();
        bracketsRelation.put('{','}');
        bracketsRelation.put('(',')');
        bracketsRelation.put('[',']');
        Stack<Character> strStack=new Stack<Character>();

        int i=0;
        while (i<len){
            char currentChar = s.charAt(i);
            if (strStack.isEmpty()){
                strStack.push(currentChar);
                i++;
                continue;
            }
            char topChar=strStack.peek();

            if(topChar==')'||topChar=='}'||topChar==']'){
                break;
            }

            if (currentChar!=bracketsRelation.get(topChar)) {
                strStack.push(currentChar);
            }else {
                strStack.pop();
            }
            i++;
        }
        return strStack.isEmpty();
    }
}

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NorthSmile

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值