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

简介: 使用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)数量级。

相关文章
|
6月前
|
搜索推荐 前端开发 数据可视化
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
本文介绍了一个基于Django框架、协同过滤算法、ECharts数据可视化以及Bootstrap前端技术的酒店推荐系统,该系统通过用户行为分析和推荐算法优化,提供个性化的酒店推荐和直观的数据展示,以提升用户体验。
237 1
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
|
2月前
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
170 3
|
6月前
|
算法
【算法】滑动窗口——找到字符串中所有字母异位词
【算法】滑动窗口——找到字符串中所有字母异位词
|
3月前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
4月前
|
算法
两个字符串匹配出最长公共子序列算法
本文介绍了最长公共子序列(LCS)问题的算法实现,通过动态规划方法求解两个字符串的最长公共子序列,并提供了具体的编程实现细节和示例。
135 1
两个字符串匹配出最长公共子序列算法
|
5月前
|
算法 前端开发 机器人
一文了解分而治之和动态规则算法在前端中的应用
该文章详细介绍了分而治之策略和动态规划算法在前端开发中的应用,并通过具体的例子和LeetCode题目解析来说明这两种算法的特点及使用场景。
一文了解分而治之和动态规则算法在前端中的应用
|
4月前
|
移动开发 算法 前端开发
前端常用算法全解:特征梳理、复杂度比较、分类解读与示例展示
前端常用算法全解:特征梳理、复杂度比较、分类解读与示例展示
54 0
|
5月前
|
前端开发 JavaScript
前端基础(十五)_时间对象、字符串对象
本文介绍了JavaScript中时间对象的操作方法,包括获取和设置年、月、日、小时、分钟、秒等,以及如何格式化时间显示,同时提及了字符串对象的常用方法。
42 0
前端基础(十五)_时间对象、字符串对象
|
6月前
|
前端开发 JavaScript Java
【前端学java】详解java中的字符串操作(11)
【8月更文挑战第10天】详解java中的字符串操作
33 3
【前端学java】详解java中的字符串操作(11)
|
5月前
|
算法 前端开发
一文了解贪心算法和回溯算法在前端中的应用
该文章深入讲解了贪心算法与回溯算法的原理及其在前端开发中的具体应用,并通过分析LeetCode题目来展示这两种算法的解题思路与实现方法。

热门文章

最新文章

  • 1
    以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
    24
  • 2
    大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
    43
  • 3
    【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
    25
  • 4
    巧用通义灵码,提升前端研发效率
    84
  • 5
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    137
  • 6
    详解智能编码在前端研发的创新应用
    92
  • 7
    智能编码在前端研发的创新应用
    75
  • 8
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    35
  • 9
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    111
  • 10
    【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
    73