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 相关文章推荐
windows下安装python paramiko模块的代码
Feb 10 Python
高性能web服务器框架Tornado简单实现restful接口及开发实例
Jul 16 Python
Python中的Matplotlib模块入门教程
Apr 15 Python
在Python中通过threading模块定义和调用线程的方法
Jul 12 Python
python cx_Oracle的基础使用方法(连接和增删改查)
Nov 19 Python
解决Python pandas df 写入excel 出现的问题
Jul 04 Python
如何优雅地处理Django中的favicon.ico图标详解
Jul 05 Python
python通过ffmgep从视频中抽帧的方法
Dec 05 Python
Python实例方法、类方法、静态方法的区别与作用详解
Mar 25 Python
Pandas0.25来了千万别错过这10大好用的新功能
Aug 07 Python
Python函数的迭代器与生成器的示例代码
Jun 18 Python
在django中实现choices字段获取对应字段值
Jul 12 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
Laravel 5框架学习之子视图和表单复用
2015/04/09 PHP
浅析PHP中Session可能会引起并发问题
2015/07/23 PHP
asp.net+js 实现无刷新上传解析csv文件的代码
2010/05/17 Javascript
将string解析为json的几种方式小结
2010/11/11 Javascript
你可能不知道的JavaScript的new Function()方法
2014/04/17 Javascript
Javascript this 关键字 详解
2014/10/22 Javascript
程序员必知35个jQuery 代码片段
2015/11/05 Javascript
基于BootStrap环境写jQuery tabs插件
2016/07/12 Javascript
微信小程序 闭包写法详细介绍
2016/12/14 Javascript
JavaScript中object和Object的区别(详解)
2017/02/27 Javascript
老生常谈js-react组件生命周期
2017/05/02 Javascript
JavaScript数组_动力节点Java学院整理
2017/06/26 Javascript
详解vue静态资源打包中的坑与解决方案
2018/02/05 Javascript
AngularJS动态添加数据并删除的实例
2018/02/27 Javascript
Vue下路由History模式打包后页面空白的解决方法
2018/06/29 Javascript
JS 实现发送短信验证码的“59秒后重新发送验证短信”功能
2019/08/23 Javascript
javascript实现搜索筛选功能实例代码
2020/11/12 Javascript
vue3+typeScript穿梭框的实现示例
2020/12/29 Vue.js
Python设计模式之代理模式实例
2014/04/26 Python
Python字典数据对象拆分的简单实现方法
2017/12/05 Python
Tensorflow之MNIST CNN实现并保存、加载模型
2020/06/17 Python
基于python的opencv图像处理实现对斑马线的检测示例
2020/11/29 Python
html5 worker 实例(一) 为什么测试不到效果
2013/06/24 HTML / CSS
SISLEY希思黎官方旗舰店:享誉全球的奢华植物美容品牌
2018/04/25 全球购物
JustFab加拿大:女鞋、靴子、手袋和服装在线
2018/05/18 全球购物
澳大利亚运动鞋零售商:The Athlete’s Foot
2018/11/04 全球购物
俄罗斯化妆品和香水网上商店:Iledebeaute
2019/01/03 全球购物
可靠的数据流传输TCP
2016/03/15 面试题
先进事迹报告会感言
2014/01/24 职场文书
冰淇淋开店创业计划书
2014/02/01 职场文书
开业典礼致辞
2015/07/29 职场文书
继续教育心得体会(共6篇)
2016/01/19 职场文书
Python获取百度热搜的完整代码
2021/04/07 Python
一篇文章学会Vue中间件管道
2021/06/20 Vue.js
Pycharm连接远程服务器并远程调试的全过程
2021/06/24 Python
Python类方法总结讲解
2021/07/26 Python