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 相关文章推荐
vc6编写python扩展的方法分享
Jan 17 Python
Python3里的super()和__class__使用介绍
Apr 23 Python
浅析Python多线程下的变量问题
Apr 28 Python
Python编程中实现迭代器的一些技巧小结
Jun 21 Python
全面了解Python环境配置及项目建立
Jun 30 Python
Python遍历目录中的所有文件的方法
Jul 08 Python
python3解析库lxml的安装与基本使用
Jun 27 Python
pandas去除重复列的实现方法
Jan 29 Python
python进程和线程用法知识点总结
May 28 Python
使用Python实现图像标记点的坐标输出功能
Aug 14 Python
windows+vscode安装paddleOCR运行环境的步骤
Nov 11 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
Jan 24 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
精致的人儿就要挑杯子喝咖啡
2021/03/03 冲泡冲煮
采用thinkphp自带方法生成静态html文件详解
2014/06/13 PHP
Zend Framework教程之路由功能Zend_Controller_Router详解
2016/03/07 PHP
JavaScript的面向对象(二)
2006/11/09 Javascript
jQuery 注意事项 与原因分析
2009/04/24 Javascript
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
2010/02/07 Javascript
javascript 浏览器检测代码精简版
2010/03/04 Javascript
基于jquery的3d效果实现代码
2011/03/23 Javascript
Array, Array Constructor, for in loop, typeof, instanceOf
2011/09/13 Javascript
JS返回上一页实例代码通过图片和按钮分别实现
2013/08/16 Javascript
Node.js中对通用模块的封装方法
2014/06/06 Javascript
使用js实现数据格式化
2014/12/03 Javascript
js实现鼠标移到链接文字弹出一个提示层的方法
2015/05/11 Javascript
Bootstrap编写一个在当前网页弹出可关闭的对话框 非弹窗
2016/06/30 Javascript
深入理解Angular中的依赖注入
2017/06/26 Javascript
浅谈Vue2.0中v-for迭代语法的变化(key、index)
2018/03/06 Javascript
node.js博客项目开发手记
2018/03/16 Javascript
移动端吸顶fixbar的解决方案详解
2019/07/17 Javascript
js实现简单的打印表格
2020/01/15 Javascript
使用python绘制人人网好友关系图示例
2014/04/01 Python
浅析Python的Django框架中的Memcached
2015/07/23 Python
手把手教你使用Python创建微信机器人
2019/04/29 Python
如何利用Anaconda配置简单的Python环境
2019/06/24 Python
python 缺失值处理的方法(Imputation)
2019/07/02 Python
python实现批量修改服务器密码的方法
2019/08/13 Python
浅谈pytorch、cuda、python的版本对齐问题
2020/01/15 Python
Python集合操作方法详解
2020/02/09 Python
将pytorch转成longtensor的简单方法
2020/02/18 Python
利用css3如何设置没有上下边的列表间隔线
2017/07/03 HTML / CSS
amazeui时间组件的实现示例
2020/08/18 HTML / CSS
使用索引(Index)有哪些需要考虑的因素
2016/10/19 面试题
兴趣小组活动总结
2014/05/05 职场文书
中学生清明节演讲稿
2015/03/18 职场文书
2019年作为一名实习生的述职报告
2019/09/29 职场文书
python爬取网页版QQ空间,生成各类图表
2021/06/02 Python
Mysql排序的特性详情
2021/11/01 MySQL