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 BeautifulSoup中文乱码问题的2种解决方法
Apr 22 Python
python使用any判断一个对象是否为空的方法
Nov 19 Python
Python最基本的输入输出详解
Apr 25 Python
python开发之for循环操作实例详解
Nov 12 Python
Python之web模板应用
Dec 26 Python
解决Pycharm无法import自己安装的第三方module问题
May 18 Python
python实现搜索文本文件内容脚本
Jun 22 Python
对tensorflow 的模型保存和调用实例讲解
Jul 28 Python
使用CodeMirror实现Python3在线编辑器的示例代码
Jan 14 Python
Django 框架模型操作入门教程
Nov 05 Python
Keras使用tensorboard显示训练过程的实例
Feb 15 Python
浅谈Python3中print函数的换行
Aug 05 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的autoload自动加载机制使用说明
2010/12/28 PHP
php数组函数序列之array_splice() - 在数组任意位置插入元素
2011/11/07 PHP
destoon利用Rewrite规则设置网站安全
2014/06/21 PHP
深入解析PHP的Laravel框架中的event事件操作
2016/03/21 PHP
PHP命名空间namespace的定义方法详解
2017/03/29 PHP
PHP实现负载均衡session共享redis缓存操作示例
2018/08/22 PHP
javascript小数计算出现近似值的解决办法
2010/02/06 Javascript
浅谈JavaScript编程语言的编码规范
2011/10/21 Javascript
按下回车键指向下一个位置的一个函数代码
2014/03/10 Javascript
JavaScript中的标签语句用法分析
2015/02/10 Javascript
理解javascript中的原型和原型链
2015/07/30 Javascript
微信小程序 仿美团分类菜单 swiper分类菜单
2017/04/12 Javascript
mac上node.js环境的安装测试
2017/07/03 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
vue对storejs获取的数据进行处理时遇到的几种问题小结
2018/03/20 Javascript
vue-cli系列之vue-cli-service整体架构浅析
2019/01/14 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
2019/12/16 Javascript
浅谈Vue.use到底是什么鬼
2020/01/21 Javascript
小程序点餐界面添加购物车左右摆动动画
2020/09/23 Javascript
python抓取京东价格分析京东商品价格走势
2014/01/09 Python
实例讲解python函数式编程
2014/06/09 Python
python常用知识梳理(必看篇)
2017/03/23 Python
python实现汉诺塔算法
2021/03/01 Python
Pycharm之快速定位到某行快捷键的方法
2019/01/20 Python
简单了解python高阶函数map/reduce
2019/06/28 Python
使用tqdm显示Python代码执行进度功能
2019/12/08 Python
三个python爬虫项目实例代码
2019/12/28 Python
关于Python turtle库使用时坐标的确定方法
2020/03/19 Python
matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
2021/01/05 Python
CSS3悬停效果案例应用
2012/11/21 HTML / CSS
2019年分享net面试的经历和题目
2016/08/07 面试题
公司领导推荐信
2013/11/12 职场文书
教育专业毕业生推荐信
2014/07/10 职场文书
客户答谢会活动方案
2014/08/31 职场文书
奥巴马当选演讲稿
2014/09/10 职场文书
工程部岗位职责范本
2015/04/11 职场文书