【前端算法】判断一个字符串的括号是否成对匹配

简介: 使用typescript完成判断一个字符串的括号是否成对匹配的过程
  • 一个字符串str可能包含 {} ()[] 三种括号
  • 判断 str 是否是括号成对匹配
  • 如 (a{b}c)匹配,而 {a(b 或者 {a(b}c)就不匹配

了解栈

  • 先进后出
  • API:push pop length
  • 相关的:队列,堆

逻辑结构 VS 物理结构

  • 栈 VS 数组
  • 栈:逻辑结构。理论模型,不管如何实现,不受任何语言的限制
  • 数组:物理结构。真实的功能实现,受限于编程语言

数组可以实现栈,栈是一个抽象的模型,栈实现不了数组

解题思路

  • 遇到左括号 {([ 就压栈(入栈)
  • 遇到右括号})] 就判断栈顶,匹配则出栈,不匹配这直接返回false
  • 最后判断length是否为0,是则返回true,反之false

代码实现功能

function matchBracket (str: string): boolean {
  const len = str.length
  if (len === 0) return true;

  const leftBracket = '({['
  const rightBracket = ')}]'
  const stack = []

  for ( let i = 0; i < len; i++) {
    const s = str[i]
    if (leftBracket.includes(s)) {
      // 左括号压栈
      stack.push(s)
    } else if (rightBracket.includes(s)) {
      // 获取左括号的栈顶元素
      const top = stack[stack.length -1]
      if (
        (top === '(' && s === ')') ||
        (top === '{' && s === '}') || 
        (top === '[' && s === ']')
      ) {
        // 右括号出栈
        stack.pop()
      } else {
        // 不成对匹配,匹配失败
        return false;
      }
    }
  }
  return stack.length === 0
}

功能测试

const res1 = matchBracket('(a{b}c)')
const res2 = matchBracket('(a{b)c]')
const res3 = matchBracket('(a{b')
const res4 = matchBracket('')
console.log(res1) // true
console.log(res2) // false
console.log(res3) // true
console.log(res4) // true

功能基本实现。

单元测试

describe('括号匹配', () => {
    it('正常情况', () => {
        const str = '(a{b}c)'
        const res = matchBracket(str)
        expect(res).toBe(true)
    })
    
    it('不匹配情况', () => {
        const str = '(a{b)c]'
        const res = matchBracket(str)
        expect(res).toBe(true)
    })
    
    it('字符串为空的情况', () => {
        const str = ''
        const res = matchBracket(str)
        expect(res).toBe(true)
    })
})

性能分析

  • 时间复杂度O(n)
  • 空间复杂度O(n)

对于时间复杂度:关于includes这个API来说,它的时间复杂度是O(n), 但是在这里只用了3个固定的字符来使用这个API,计算量可以算为常量级别。

对于空间复杂度:这里新建了一个数组,它的长度大小和字符串里面包含的左括号成正比,所以在这里它的空间复杂度是O(n)数量级。

相关文章
|
12月前
|
前端开发
前端使用正则表达式检查是否为十六进制字符串
前端使用正则表达式检查是否为十六进制字符串
282 6
|
算法
【算法】滑动窗口——找到字符串中所有字母异位词
【算法】滑动窗口——找到字符串中所有字母异位词
267 0
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
1218 4
|
算法
两个字符串匹配出最长公共子序列算法
本文介绍了最长公共子序列(LCS)问题的算法实现,通过动态规划方法求解两个字符串的最长公共子序列,并提供了具体的编程实现细节和示例。
450 1
两个字符串匹配出最长公共子序列算法
|
算法 前端开发 机器人
一文了解分而治之和动态规则算法在前端中的应用
该文章详细介绍了分而治之策略和动态规划算法在前端开发中的应用,并通过具体的例子和LeetCode题目解析来说明这两种算法的特点及使用场景。
一文了解分而治之和动态规则算法在前端中的应用
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
422 4
|
前端开发 JavaScript Java
【前端学java】详解java中的字符串操作(11)
【8月更文挑战第10天】详解java中的字符串操作
143 3
【前端学java】详解java中的字符串操作(11)
|
算法 前端开发
一文了解贪心算法和回溯算法在前端中的应用
该文章深入讲解了贪心算法与回溯算法的原理及其在前端开发中的具体应用,并通过分析LeetCode题目来展示这两种算法的解题思路与实现方法。
|
前端开发 JavaScript
前端基础(十五)_时间对象、字符串对象
本文介绍了JavaScript中时间对象的操作方法,包括获取和设置年、月、日、小时、分钟、秒等,以及如何格式化时间显示,同时提及了字符串对象的常用方法。
391 0
前端基础(十五)_时间对象、字符串对象
|
JavaScript 算法 前端开发
"揭秘Vue.js的高效渲染秘诀:深度解析Diff算法如何让前端开发快人一步"
【8月更文挑战第20天】Vue.js是一款备受欢迎的前端框架,以其声明式的响应式数据绑定和组件化开发著称。在Vue中,Diff算法是核心之一,它高效计算虚拟DOM更新时所需的最小实际DOM变更,确保界面快速准确更新。算法通过比较新旧虚拟DOM树的同层级节点,递归检查子节点,并利用`key`属性优化列表更新。虽然存在局限性,如难以处理跨层级节点移动,但Diff算法仍是Vue高效更新机制的关键,帮助开发者构建高性能Web应用。
402 1