有效的括号,成对字符合法性检测

说在前面

🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。

一、题目描述

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。

左括号必须以正确的顺序闭合。

示例 1:

输入:s = "()"
输出:true

示例 2:

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

示例 3:

输入:s = "(]"
输出:false

二、思路分析

阅读完题目后,我们可以知道这道题目我们可以使用栈这个结构来进行解题,那么什么是栈呢?

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

JavaScript内部的Array数组即可以当成栈来使用,使用push方法入栈,pop方法出栈。

三、AC代码

var isValid = function(s) {
    let stack = [];
    const emuMap = {
      "}": "{",
      "]": "[",
      ")": "(",
    };
    for(let i = 0; i < s.length; i++){
        if(Object.keys(emuMap).includes(s[i])){
            if(stack.pop() != emuMap[s[i]]) return false;
        }else{
            stack.push(s[i]);
        }
    }
    return stack.length == 0;
};

四、实际应用

在我们日常编程中,括号都是成对出现的,比如“()”“[]”“{}”“<>”这些成对出现的符号。

那么具体处理的方法就是:凡是遇到括号的前半部分,即把这个元素入栈,凡是遇到括号的后半部分就比对栈顶元素是否该元素相匹配,如果匹配,则前半部分出栈,否则就是匹配出错。

如下图,我们可以使用栈这个特性来实现一个实时校验输入字符串合法性的功能。

image.png

字符串合法性实时监测

html部分

使用vue进行数据绑定来实时监听数据变化,数据变化时检验数据的合法性,不合法则标红显示。

<template>
  <div>
    <div>括号匹配校验</div>
    <div class="search-box">
      <div class="dir">
        <div class="title">检验字符串</div>
        <textarea placeholder="检验字符串" v-model="str"></textarea>
      </div>
      <div class="result-box">
        <div class="title">检验结果</div>
        <div class="result">
          <span
            v-for="(item, index) in result"
            :key="'str' + index"
            :style="item.style"
            >{{ item.text }}</span
          >
        </div>
      </div>
    </div>
  </div>
</template>
script部分

emuMap声明需要校验的字符对,在watch中监听字符串的变化,变化时触发校验方法。

<script>
const emuMap = {
  "}": "{",
  "]": "[",
  ")": "(",
  ")": "(",
};
export default {
  name: "stack",
  data() {
    return {
      str: "",
      result: "",
    };
  },
  watch: {
    str() {
      this.doCheck();
    },
  },
  created() {},
  methods: {
    getStyle(index) {
      let res = "";
      if (this.result === index + "") res += "color:red;";
      return res;
    },
    doCheck() {
      let res = [];
      for (let i = 0; i < this.str.length; i++) {
        res.push({
          text: this.str[i],
          style: "",
        });
      }
      let ind = this.getIndex();
      if (ind !== true) {
        while (ind < this.str.length) {
          res[parseInt(ind)].style = "color:red;";
          ind++;
        }
      }
      this.result = res;
    },
    getIndex() {
      let stack = [],
        stackI = [],
        s = this.str;
      for (let i = 0; i < s.length; i++) {
        if (Object.keys(emuMap).includes(s[i])) {
          stackI.pop();
          if (stack.pop() !== emuMap[s[i]]) return i;
        } else if (Object.values(emuMap).includes(s[i])) {
          stackI.push(i);
          stack.push(s[i]);
        }
      }
      return stackI.length == 0 || stackI[0];
    },
  },
};
</script>
css部分
<style lang="scss" scoped>
.search-box {
  border: 1px solid black;
  min-height: 300px;
  width: 600px;
  display: flex;
  flex-wrap: wrap;
  margin: auto;
  margin-top: 20px;
  .dir {
    flex: 1;
    margin-right: 1rem;
    textarea {
      width: 100%;
      height: 80%;
    }
  }
  .result-box {
    flex: 1;
    .result {
      border: 1px solid black;
      height: 80%;
    }
  }
}
</style>

公众号

关注公众号『前端也能这么有趣』,获取更多有趣内容。

说在后面

🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/245576.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS学习 第2节 DevEco Studio工程介绍

工程配置页 界面布局介绍 代码编辑区、通知栏、工程目录区、预览区 工程目录区 便于理解&#xff0c;可以切换为 Ohos AppScope主要用于存放整个应用公共的信息与资源 entry默认的初始模块ets文件用于存放编写的代码文件configuration存放相应模块的配置文件resources对应模块…

交叉编译---理解+环境配置

文章目录 一、基础理解二、配置环境方式一&#xff1a;临时输入&#xff08;麻烦&#xff09;方式二&#xff1a;编写脚本文件&#xff08;推荐&#xff09;方式三&#xff1a;永久指定&#xff08;不太推荐&#xff09; 三、知识补充&#xff1a;source与 ./1、source2、命令.…

Signal EM的流程与分析

RedhawkTM 提供了一种在设计中分析Power EM和SignalEM的单一平台方法。Power EM通常作为Static IR和Dynamic IR分析的组成部分进行。Signal EM分析是单独进行分析的,检查设计中所有信号线和过孔的平均(单向或双向)、RMS和峰值电流密度【1】。 1 SignalEM 流程介绍 如图7…

Jmeter,提取响应体中的数据:正则表达式、Json提取器

一、正则表达式 1、线程组--创建线程组&#xff1b; 2、线程组--添加--取样器--HTTP请求&#xff1b; 3、Http请求--添加--后置处理器--正则表达式提取器&#xff1b; 4、线程组--添加--监听器--查看结果树&#xff1b; 5、线程组--添加--取样器--调试取样器。 响应体数据…

C++ 11 初识

一.C 11的简介 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff0c;使得C03这个名字已经取代了C98称为C11之前的最新C标准名称。不过由于C03(TC1)主要是对C98标准中的漏洞进行修复&#xff0c;语言的核心部分则没有改动&#xff0c;因此人们习惯性的把两个标准合…

什么是 API 代理?

API 代理就像您的计算机和互联网上的特殊服务之间的有用中间人。这有点像将翻译、保安和信使合而为一。 什么是 API 代理&#xff1f; API 代理就像您和在线服务之间的有用中间人。当您的计算机需要从特殊在线服务&#xff08;API&#xff09;获取某些内容时&#xff0c;API 代…

一步步教你制作婚礼策划展示小程序

随着互联网的发展&#xff0c;越来越多的服务和产品开始通过线上进行展示和销售。婚庆行业也不例外。通过制作婚庆小程序&#xff0c;商家可以更好地展示婚庆服务、婚礼策划、婚宴预定等相关信息&#xff0c;吸引更多的潜在客户。本文将介绍如何从零开始制作婚庆小程序&#xf…

芸鹰蓬飞:抖店的运营技巧是什么?

抖店&#xff0c;作为抖音平台上的电商业务&#xff0c;为商家提供了一个全新的销售渠道。然而&#xff0c;要成功运营抖店&#xff0c;商家需要掌握一定的方法和技巧。下面&#xff0c;我们就来详细介绍一下抖店的运行方式。 商品选择&#xff1a;首先&#xff0c;商家需要选择…

DS二分查找_搜索二维矩阵(纯二分查找写法)

本题我写了两个方法&#xff0c;一个是的时间复杂度,就是本文章一个mn时间复杂度&#xff0c;这个比较简单&#xff0c;如果不会二分法可以看这篇文章 Description 使用二分查找法来判断m*n矩阵matrix中是否存在目标值target。 该矩阵有以下特性&#xff1a; 1. 每行中的整数…

一键提取微信聊天记录,生成HTML、Word文档永久保存,还能生成微信年度聊天报告

不知道生活中你有没有遇到过这种情况&#xff0c;聊天记录不完整&#xff0c;有的在手机上&#xff0c;有的在电脑上&#xff0c;搜索起来很烦。那有没有一种办法可以把微信聊天记录统一呢&#xff1f;当然是有的。下面&#xff0c;就让我们一起来看一下怎么操作。 先看效果 操…

卧槽!jmeter 竟然这么牛逼,压测爽歪歪~

# Http请求模拟 1、新建线程组 操作&#xff1a;鼠标右键测试计划 -> 添加 -> Threads(Users) -> 线程组 -> 修改测试计划名称 新建线程组 2、添加取样器HTTP请求 操作&#xff1a;鼠标右键线程组 -> 添加 -> Sampler -> HTTP请求 -> 填写请求参数 添…

飞轮储能一次调频并网三机九节点系统,虚拟惯性和下垂控制,也可加入虚拟同步机VSG控制,飞轮储能容量可调,系统频率50Hz,离散模型

5MW飞轮储能一次调频并网三机九节点系统&#xff0c;虚拟惯性和下垂控制&#xff0c;也可加入虚拟同步机VSG控制&#xff0c;飞轮储能容量可调&#xff0c;系统频率50Hz&#xff0c;离散模型&#xff0c;仿真运行速度快。 飞轮储能变流器采用双PWM环设计&#xff0c;并网电压电…

基于javaweb实现的实践教学基地管理系统

一、系统架构 前端&#xff1a;html | js | css | bootstrap 后端&#xff1a;spring | springmvc | mybatis-plus 环境&#xff1a;jdk1.8 | mysql8 | tomcat | maven 二、代码及数据库 三、功能介绍 01. web-首页1 02. web-首页2 03. web-首页3 04. web-首页4 05. 管…

深入理解 Go 语言 Goroutine 的工作原理

一、设计思路 1、设计描述 启动服务之时先初始化一个 Goroutine Pool 池&#xff0c;这个 Pool 维护了一个类似栈的 LIFO 队列&#xff0c;里面存放负责处理任务的 Worker然后在 client 端提交 task 到 Pool 中之后&#xff0c;在 Pool 内部&#xff0c;接收 task 之后的核心…

【计算机组成体系结构】只读存储器ROM

一、ROM分类 二、计算机中重要的ROM 运行时操作系统在主存中&#xff0c;但是由于RAM断电后数据会丢失&#xff0c;所以操作系统都存储在辅存中&#xff0c;在开机时由CPU读入主存&#xff0c;而BIOS芯片就是用来存储自举装入程序的&#xff0c;它用于开机时引导把操作系统装入…

C#中简单的继承和多态

今天我们来聊一聊继承&#xff0c;说实话今天也是我第一次接触。 继承的概念是什么呢&#xff1f;就是一个类可以继承另一个类的属性和方法&#xff08;成员&#xff09; 继承是面向对象编程中的一个非常重要的特性。 好了&#xff0c;废话不多说&#xff0c;下面切入正题&a…

ArrayList与顺序表(带完整实例)

【本节目标】 1. 线性表 2. 顺序表 3. ArrayList的简介 4. ArrayList使用 5. ArrayList的扩容机制 6. 扑克牌 1.线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表…

输入框内容部分不可修改el-input部分动态内容不可修改完整代码 省市区联动,详细地址中省市区选择后不可更改

<tr><e-td :required"!read" label><span>地区&#xff1a;</span></e-td><td><divclass"table-cell-flex"style"width:450px"v-if"!read && this.data.nationCode 148"><el-f…

【ECharts】从零实现echarts地图完整代码(纯前端,包含地图资源)

最终效果 标题环境搭建 这里忽略创建vue项目的操作过程&#xff0c;请自行搭建 vue2 项目、less 环境 安装下载 echarts 这里我们选择npm下载 npm install echarts安装成功后&#xff0c;在 main.js 中把echarts配置到this上 // 引入 echarts import * as Echarts from ech…

【每日一题】用邮票贴满网格图

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;二维前缀和二维差分 写在最后 Tag 【二维前缀和】【二维差分】【矩阵】【2023-12-14】 题目来源 2132. 用邮票贴满网格图 题目解读 在 01 矩阵中&#xff0c;判断是否可以用给定尺寸的邮票将所有 0 位置都覆盖住&…