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基于回溯法子集树模板解决数字组合问题实例
Sep 02 Python
python之virtualenv的简单使用方法(必看篇)
Nov 25 Python
Python爬虫将爬取的图片写入world文档的方法
Nov 07 Python
Python3.5内置模块之time与datetime模块用法实例分析
Apr 27 Python
python 使用matplotlib 实现从文件中读取x,y坐标的可视化方法
Jul 04 Python
python pandas 时间日期的处理实现
Jul 30 Python
django框架模型层功能、组成与用法分析
Jul 30 Python
使用虚拟环境打包python为exe 文件的方法
Aug 29 Python
Python全栈之列表数据类型详解
Oct 01 Python
使用pth文件添加Python环境变量方式
May 26 Python
Python爬取YY评级分数并保存数据实现过程解析
Jun 01 Python
keras model.fit 解决validation_spilt=num 的问题
Jun 19 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
搜索引擎技术核心揭密
2006/10/09 PHP
CI框架装载器Loader.php源码分析
2014/11/04 PHP
PHP图片添加水印功能示例小结
2016/10/03 PHP
用示例说明filter()与find()的用法以及children()与find()的区别分析
2013/04/26 Javascript
调试JavaScript中正则表达式中遇到的问题
2015/01/27 Javascript
jquery图片切换实例分析
2015/04/15 Javascript
jQuery检测输入的字符串包含的中英文的数量
2015/04/17 Javascript
JS+JSP通过img标签调用实现静态页面访问次数统计的方法
2015/12/14 Javascript
基于JavaScript实现网页倒计时自动跳转代码
2015/12/28 Javascript
bootstrap布局中input输入框右侧图标点击功能
2016/05/16 Javascript
微信小程序 POST请求(网络请求)详解及实例代码
2016/11/16 Javascript
微信小程序 页面跳转及数据传递详解
2017/03/14 Javascript
彻底理解js面向对象之继承
2018/02/04 Javascript
jQuery实现输入框的放大和缩小功能示例
2018/07/21 jQuery
JavaScript高级函数应用之分时函数实例分析
2018/08/03 Javascript
vue实现滑动到底部加载更多效果
2020/10/27 Javascript
layui问题之模拟table表格中的选中按钮选中事件的方法
2019/09/20 Javascript
python中的字典使用分享
2016/07/31 Python
django实现用户登陆功能详解
2017/12/11 Python
python numpy 显示图像阵列的实例
2018/07/02 Python
Python中注释(多行注释和单行注释)的用法实例
2019/08/28 Python
Python 类属性与实例属性,类对象与实例对象用法分析
2019/09/20 Python
Python调用.net动态库实现过程解析
2020/06/05 Python
openCV提取图像中的矩形区域
2020/07/21 Python
Python -m参数原理及使用方法解析
2020/08/21 Python
html5指南-7.geolocation结合google maps开发一个小的应用
2013/01/07 HTML / CSS
澳大利亚婴儿礼品公司:The Baby Gift Company
2018/11/04 全球购物
Perfume’s Club意大利官网:欧洲美妆电商
2019/05/03 全球购物
中专毕业生自荐信范文
2013/11/28 职场文书
网络技术专业求职信
2014/02/18 职场文书
1000字打架检讨书
2014/11/03 职场文书
我的兄弟姐妹观后感
2015/06/15 职场文书
运动会通讯稿600字
2015/07/20 职场文书
JavaScript 防篡改对象的用法示例
2021/04/24 Javascript
深入理解MySQL中MVCC与BufferPool缓存机制
2022/05/25 MySQL
python如何为list实现find方法
2022/05/30 Python