Python实现括号匹配方法详解


Posted in Python onFebruary 10, 2020

这篇文章主要介绍了python实现括号匹配方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

1.用一个栈【python中可以用List】就可以解决,时间和空间复杂度都是O(n)

# -*- coding: utf8 -*-
# 符号表
SYMBOLS = {'}': '{', ']': '[', ')': '(', '>': '<'}
SYMBOLS_L, SYMBOLS_R = SYMBOLS.values(), SYMBOLS.keys()

def check(s):
  arr = []
  for c in s:
    if c in SYMBOLS_L:
      # 左符号入栈
      arr.append(c)
    elif c in SYMBOLS_R:
      # 右符号要么出栈,要么匹配失败
      if arr and arr[-1] == SYMBOLS[c]:
        arr.pop()
      else:
        return False

  return True

print(check("3 * {3 +[(2 -3) * (4+5)]}"))
print(check("3 * {3+ [4 - 6}]"))

2.

# 存储左括号和右括号
open_brackets = '([{<'
close_brackets = ')]}>'
# 映射左右括号便于出栈判断
brackets_map = {')': '(', ']': '[', '}': '{', '>': '<'}

# 对于每一行数据,进行如下判定若括号为左括号,加入栈,若括号为右括号,判断是否跟栈尾括号对应,
 若对应,弹出栈尾元素,若所有括号均正确闭合,则最后栈为空。
for row in rows:
  stack = []
  label = True
  for char in row:
    if char in open_brackets:
      stack.append(char)
    elif char in close_brackets:
      if len(stack) < 1:
        label = False
        break
      elif brackets_map[char] == stack[-1]:
        stack.pop()
      else:
        label = False
        break
    else:
      continue
  if stack != []:
    label = False
  print(label)

rows = [
'([<^>x[ ]{a}]{/}{t}g<^>)<{x}b>{x}<z({%}w >[b][c[c]]{<h>{h}}',
 '[/]{((x)({{*}*}w)w){f}{v}[%(^[z]{u}{ })([[ ]-]h)]{c}(*)[y]}',
 '<<(^)z>>[b]< >[[(c)u[v]{z<b< >><b>}]g][/b[(])v(v)(+)](v)',
 '[[b]][(v)g]<z>([{{<->+}e}[*]d<+>]g[[a] <+>(v){b}<e>]){a}[u]']

3.

在长度很大的时候可以尽快判断一些比较明显的错误的模式,节省时间:

主要的思路:

首先设置两个列表分别存放的是各种括号的开括号和闭括号,然后遍历给定的字符串,分如下几种情况:

1.字符串 首字符 出现在闭括号列表中,直接结束,输出错误

2.字符串长度不为偶数,直接结束,输出错误

3.对原始字符串列表化去重,如果去重后的列表长度不为偶数直接结束,输出错误

4.遍历字符串,将属于开括号集合的括号加入到列表中,当遇上一个闭括号的时候计算该闭括号在闭括号列表中的索引与
当前列表最后一个开括号在开括号列表中的索引是否一致,一致则继续,否则直接结束,输出错误

#!usr/bin/env python
# encoding:utf-8

def bracket_mathch(one_str):
  '''''
  括号匹配
  '''
  tmp_list = []
  open_bracket_list = ['(', '[', '{', '<', '《']
  close_bracket_list = [')', ']', '}', '>', '》']
  one_str_list = list(one_str)
  length = len(one_str_list)
  set_list = list(set(one_str_list))
  num_list = [one_str_list.count(one) for one in set_list]
  if one_str[0] in close_bracket_list:
    return False
  elif length % 2 != 0:
    return False
  elif len(set_list) % 2 != 0:
    return False
  else:
    for i in range(length):
      if one_str[i] in open_bracket_list:
        tmp_list.append(one_str[i])
      elif one_str[i] in close_bracket_list:
        if close_bracket_list.index(one_str[i]) == open_bracket_list.index(tmp_list[-1]):
          tmp_list.pop()
        else:
          return False
          break
  return True
if __name__ == '__main__':
  one_str_list = ['({})', '({[<《》>]})', '[(]){}', '{{{{{{', '([{}])', '}{[()]']
  for one_str in one_str_list:
    if bracket_mathch(one_str):
      print(one_str, '正确')
    else:
      print(one_str, '错误')

  tmp = '{}[{()()[]<{{[[[[(())()()(){}[]{}[]()<>]]]]}}>}]'
  print(bracket_mathch(tmp))

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用Python登录Gmail并发送Gmail邮件的教程
Apr 17 Python
Djang中静态文件配置方法
Jul 30 Python
Python数组遍历的简单实现方法小结
Apr 27 Python
利用Celery实现Django博客PV统计功能详解
May 08 Python
深入理解Python中的内置常量
May 20 Python
MAC中PyCharm设置python3解释器
Dec 15 Python
python实现机器学习之多元线性回归
Sep 06 Python
django rest framework vue 实现用户登录详解
Jul 29 Python
python代码实现逻辑回归logistic原理
Aug 07 Python
python获取array中指定元素的示例
Nov 26 Python
Python如何绘制日历图和热力图
Aug 07 Python
pytorch中的torch.nn.Conv2d()函数图文详解
Feb 28 Python
Python re正则表达式元字符分组()用法分享
Feb 10 #Python
Tensorflow: 从checkpoint文件中读取tensor方式
Feb 10 #Python
Python获取、格式化当前时间日期的方法
Feb 10 #Python
Python3操作MongoDB增册改查等方法详解
Feb 10 #Python
Python实现结构体代码实例
Feb 10 #Python
Python守护进程实现过程详解
Feb 10 #Python
Python3 字典dictionary入门基础附实例
Feb 10 #Python
You might like
在Windows系统上安装PHP运行环境文字教程
2010/07/19 PHP
php 缩略图实现函数代码
2011/06/23 PHP
PHP实现批量清空删除指定文件夹所有内容的方法
2017/05/30 PHP
html dom节点操作(获取/修改/添加或删除)
2014/01/23 Javascript
JS批量修改PS中图层名称的方法
2014/01/26 Javascript
jquery ajax 局部刷新小案例
2014/02/08 Javascript
js实现文本框支持加减运算的方法
2015/08/19 Javascript
简单讲解AngularJS的Routing路由的定义与使用
2016/03/05 Javascript
JavaScript必知必会(二) null 和undefined
2016/06/08 Javascript
使用BootStrap进行轮播图的制作
2017/01/06 Javascript
原生JS实现Ajax跨域请求flask响应内容
2017/10/24 Javascript
vue-cli 组件的导入与使用教程详解
2018/04/11 Javascript
微信小程序利用Canvas绘制图片和竖排文字详解
2019/06/25 Javascript
基于layui框架响应式布局的一些使用详解
2019/09/16 Javascript
解决vue cli使用typescript后打包巨慢的问题
2019/09/30 Javascript
vue实现的多页面项目如何优化打包的步骤详解
2020/07/19 Javascript
vue制作toast组件npm包示例代码
2020/10/29 Javascript
[02:04]2016国际邀请赛中国区预选赛VG.R晋级之路
2016/07/01 DOTA
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
2011/03/13 Python
Python写的一个简单DNS服务器实例
2014/06/04 Python
Python脚本文件打包成可执行文件的方法
2015/06/02 Python
Python基于Floyd算法求解最短路径距离问题实例详解
2018/05/16 Python
Scrapy框架使用的基本知识
2018/10/21 Python
python事件驱动event实现详解
2018/11/21 Python
python之cv2与图像的载入、显示和保存实例
2018/12/05 Python
浅谈Python中的可迭代对象、迭代器、For循环工作机制、生成器
2019/03/11 Python
在SQLite-Python中实现返回、查询中文字段的方法
2019/07/17 Python
python字典的遍历3种方法详解
2019/08/10 Python
爬虫代理的cookie如何生成运行
2020/09/22 Python
python全栈开发语法总结
2020/11/22 Python
CSS3区域模块region相关编写示例
2015/08/28 HTML / CSS
美国宠物美容和宠物用品购物网站:Cherrybrook
2018/12/07 全球购物
致接力运动员广播稿
2014/02/17 职场文书
座谈会主持词
2014/03/20 职场文书
共产党员批评与自我批评
2014/10/15 职场文书
2014年信息宣传工作总结
2014/12/18 职场文书