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

简介: 每日算法练习,今天一起来看看“有效的括号,成对字符合法性检测”。

一、题目描述

给定一个只包括 '(',')','{','}','[',']' 的字符串 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>
目录
相关文章
|
前端开发
2023Web前端开发八股文&面试题(万字系列)——这篇就够了!
2023Web前端开发八股文&面试题(万字系列)——这篇就够了!
2615 2
|
存储 监控 Linux
【Shell 命令集合 系统管理 】⭐⭐⭐Linux 查看当前正在运行的进程信息 ps命令 使用指南
【Shell 命令集合 系统管理 】⭐⭐⭐Linux 查看当前正在运行的进程信息 ps命令 使用指南
436 0
|
存储 数据挖掘 BI
数据仓库深度解析与实时数仓应用案例探析
随着数据量的不断增长和数据应用的广泛深入,数据治理和隐私保护将成为数据仓库建设的重要议题。企业需要建立完善的数据治理体系,确保数据的准确性、一致性和完整性;同时加强隐私保护机制建设,确保敏感数据的安全性和合规性。
1133 55
|
消息中间件 NoSQL Kafka
订单超时取消的11种方式(非常详细清楚)
订单超时取消的11种方式(非常详细清楚)
8173 5
订单超时取消的11种方式(非常详细清楚)
|
机器学习/深度学习 数据采集 算法
基于机器学习的二手房价格分析与预测设计与实现
本文通过机器学习技术对西安市二手房市场价格进行分析与预测,利用数据预处理、特征提取和模型训练,深入挖掘影响房价的关键因素,旨在为市场参与者提供科学的定价信息和决策支持。
855 1
基于机器学习的二手房价格分析与预测设计与实现
|
资源调度 前端开发 JavaScript
vite3+vue3 实现前端部署加密混淆 javascript-obfuscator
【11月更文挑战第10天】本文介绍了在 Vite 3 + Vue 3 项目中使用 `javascript-obfuscator` 实现前端代码加密混淆的详细步骤,包括安装依赖、创建混淆脚本、修改 `package.json` 脚本命令、构建项目并执行混淆,以及在 HTML 文件中引用混淆后的文件。通过这些步骤,可以有效提高代码的安全性。
1280 2
|
数据可视化 Java 程序员
IDEA插件-Maven Helper
Maven Helper是一个用于Apache Maven项目的IntelliJ IDEA插件,它提供了一些有用的功能来帮助开发人员更好地管理和调试Maven项目。
1646 0
IDEA插件-Maven Helper
|
Docker Windows 容器
手把手教您在 Windows Server 2019 上使用 Docker
现在,您可以直接用 Windows Server 来运行“纯”Docker 容器,其中所有的容器进程都可以直接在主机操作系统上运行。
26718 1
|
Web App开发 数据格式 索引
|
Python
关于Python的Numpy库reshape()函数的用法
1.介绍 更改数组的形状,不改变原数组 2.语法 a = np.reshape(mat, newshape, order = ‘C’) a : newshape形状的新数组 mat : 原数组
502 0