当前位置: 首页 > article >正文

有效的括号

有效的括号

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

有效字符串需满足:

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

示例 1:

**输入:**s = “()”

**输出:**true

示例 2:

**输入:**s = “()[]{}”

**输出:**true

示例 3:

**输入:**s = “(]”

**输出:**false

示例 4:

**输入:**s = “([])”

**输出:**true

提示:

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

题解

​ 这是一道很经典的栈的问题,之前做过很多次,用过很多方法,笨拙的匹配也好,用 map 映射也好,总之我一直觉得是一道非常简单的问题;

​ 但是当我第一次看见工程师外教的代码,我才意识到,即使同为程序员,写的代码之间的差距也是非常大的,他写的代码非常的优雅简洁

class Solution {
    String OPENINGS = "({[";
    String CLOSINGS = ")}]";
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<Character>();
        for(int i = 0; i < s.length(); i++){
            if(isOPENINGS(s.charAt(i))){
                stack.push(s.charAt(i));
            }else if(isCLOSINGS(s.charAt(i))){
                if(stack.empty() || !match(stack.pop(), s.charAt(i))){
                    return false;
                }
            }
        }
        return stack.empty();
    }

    boolean isOPENINGS(Character o){
        return OPENINGS.indexOf(o) > -1;
    }

    boolean isCLOSINGS(Character o){
        return CLOSINGS.indexOf(o) > -1;
    }

    boolean match(Character a, Character b){
        return OPENINGS.indexOf(a) == CLOSINGS.indexOf(b);
    }
}
var OPENINGS string = "({["
var CLOSINGS string = ")}]"

func isValid(s string) bool {
	stack := []byte{}
	for i := 0; i < len(s); i++ {
		if isOPENING(s[i]) {
			stack = append(stack, s[i])
		} else if isCLOSINGS(s[i]) {
			if len(stack) == 0 || !match(stack[len(stack)-1], s[i]) {
				return false
			}
			stack = stack[:len(stack)-1]
		}
	}
	return len(stack) == 0
}

func isOPENING(o byte) bool {
	return strings.IndexByte(OPENINGS, o) > -1
}

func isCLOSINGS(o byte) bool {
	return strings.IndexByte(CLOSINGS, o) > -1
}

func match(a, b byte) bool {
	return strings.IndexByte(OPENINGS, a) == strings.IndexByte(CLOSINGS, b)
}

http://www.kler.cn/a/371122.html

相关文章:

  • HTML实战课堂之启动动画弹窗
  • Android 调用系统服务接口获取屏幕投影(需要android.uid.system)
  • RNN之:LSTM 长短期记忆模型-结构-理论详解-及实战(Matlab向)
  • 美摄科技为企业打造专属PC端视频编辑私有化部署方案
  • C++中引用参数与指针参数的区别与联系详解
  • 国产Docker可视化面板Dpanel的安装与功能解析
  • ASP.NET Core 应用程序的Startup笔记
  • upload-labs靶场Pass-21
  • 网络中的一些基本概念
  • GPT-Sovits-1-数据处理
  • Word设置只读后,为什么还能编辑?
  • 【Mac】Python 环境管理工具
  • Java的ArrayList集合
  • windows 驱动实例分析系列: NDIS 6.0的Filter 驱动改造(三)
  • ARCGIS PRO SDK 实现图层标注
  • 深入理解Java虚拟机(六)
  • 知识吾爱纯净版小程序系统 leibiao SQL注入漏洞复现(XVE-2024-30663)
  • 实验九 视图的使用
  • Hexo提交部署命令与Git Bash Here控制终端中按下Ctrl+C无法中断hexo s的解决办法
  • 开源一个开发的聊天应用与AI开发框架,集成 ChatGPT,支持私有部署的源码
  • SpringMVC学习(3)
  • Android的SQLiteOpenHelper类 笔记241027
  • 开发了一个成人学位英语助考微信小程序
  • Spark SQL DSL
  • QNAP威联通NAS怎么通过HBS3设置定时备份计划至外部存储
  • Python日志系统详解:Logging模块最佳实践