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迭代器的使用方法实例
Nov 21 Python
Python读写ini文件的方法
May 28 Python
python实现基本进制转换的方法
Jul 11 Python
在类Unix系统上开始Python3编程入门
Aug 20 Python
python正则中最短匹配实现代码
Jan 16 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
Aug 01 Python
基于python实现KNN分类算法
Apr 23 Python
Jupyter Notebook输出矢量图实例
Apr 14 Python
django admin管理工具自定义时间区间筛选器DateRangeFilter介绍
May 19 Python
python实现快速文件格式批量转换的方法
Oct 16 Python
python关于集合的知识案例详解
May 30 Python
Python实现批量自动整理文件
Mar 16 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
php+mysql 实现身份验证代码
2010/03/24 PHP
php设计模式 Proxy (代理模式)
2011/06/26 PHP
php5.3不能连接mssql数据库的解决方法
2014/12/27 PHP
php获取字符串前几位的实例(substr返回字符串的子串用法)
2017/03/08 PHP
PHP测试框架PHPUnit组织测试操作示例
2018/05/28 PHP
自己开发Dojo的建议框架
2008/09/24 Javascript
javawscript 三级菜单的实现原理
2009/07/01 Javascript
浅谈Javascript嵌套函数及闭包
2010/11/09 Javascript
jquery一句话全选/取消全选
2011/03/01 Javascript
JS完整获取IE浏览器信息包括类型、版本、语言等等
2014/05/22 Javascript
JS小游戏之极速快跑源码详解
2014/09/25 Javascript
jquery和js实现对div的隐藏和显示方法
2014/09/26 Javascript
EasyUI中combobox默认值注意事项
2015/03/01 Javascript
jquery插件之文字间歇自动向上滚动效果代码
2016/02/25 Javascript
JavaScript数据结构之二叉树的删除算法示例
2017/04/13 Javascript
angularjs实现上拉加载和下拉刷新数据功能
2017/06/12 Javascript
AngularJs 终极购物车(实例讲解)
2017/11/08 Javascript
vue初尝试--项目结构(推荐)
2018/01/30 Javascript
axios实现文件上传并获取进度
2020/03/25 Javascript
JavaScript实现省市联动效果
2019/11/22 Javascript
Python补齐字符串长度的实例
2018/11/15 Python
python实现公司年会抽奖程序
2019/01/22 Python
python求质数列表的例子
2019/11/24 Python
Django-imagekit的使用详解
2020/07/06 Python
使用CSS3实现SVG路径描边动画效果入门教程
2019/10/21 HTML / CSS
美国顶尖折扣时尚购物网:Bluefly
2016/08/28 全球购物
男女钓鱼靴和甲板鞋:XTRATUF
2021/01/09 全球购物
写给女生的道歉信
2014/01/08 职场文书
社团招新策划书
2014/02/04 职场文书
小学竞选班干部演讲稿
2014/08/20 职场文书
基层干部个人对照检查及整改措施
2014/10/28 职场文书
销售员自我评价
2015/03/11 职场文书
2015年大学教师工作总结
2015/05/20 职场文书
少年犯观后感
2015/06/11 职场文书
CSS 圆形进度栏
2021/04/06 HTML / CSS
redis requires ruby version2.2.2的解决方案
2021/07/15 Redis