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数据结构之图深度优先和广度优先实例详解
Jul 08 Python
12步教你理解Python装饰器
Feb 25 Python
浅谈scrapy 的基本命令介绍
Jun 13 Python
Window 64位下python3.6.2环境搭建图文教程
Sep 19 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
Nov 06 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
Aug 20 Python
python生成器用法实例详解
Nov 22 Python
解决python彩色螺旋线绘制引发的问题
Nov 23 Python
Python单例模式的四种创建方式实例解析
Mar 04 Python
mac在matplotlib中显示中文的操作方法
Mar 06 Python
10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)
Mar 17 Python
Python实现打乒乓小游戏
Sep 25 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中3种方法删除字符串中间的空格
2014/03/10 PHP
详解php设置session(过期、失效、有效期)
2015/11/12 PHP
php让json_encode不自动转义斜杠“/”的方法
2020/04/27 PHP
防止页面被iframe(兼容IE,Firefox火狐)
2010/07/04 Javascript
javascript学习笔记(一) 在html中使用javascript
2012/06/18 Javascript
JS事件在IE与FF中的区别详细解析
2013/11/20 Javascript
子页向父页传值示例
2013/11/27 Javascript
jquerydom对象的事件隐藏显示和对象数组示例
2013/12/10 Javascript
js浮点数保留两位小数点示例代码(四舍五入)
2013/12/26 Javascript
JS数组的常见用法实例
2015/02/10 Javascript
jQuery实现获取绑定自定义事件元素的方法
2015/12/02 Javascript
jQuery实现多级联动下拉列表查询框
2016/01/18 Javascript
跨域资源共享 CORS 详解
2016/04/26 Javascript
深入理解jQuery之防止冒泡事件
2016/05/24 Javascript
vue权限路由实现的方法示例总结
2018/07/29 Javascript
vue单页应用的内存泄露定位和修复问题小结
2019/08/02 Javascript
Vue项目环境搭建详细总结
2019/09/26 Javascript
JavaScript中的this妙用实例分析
2020/05/09 Javascript
Python实现备份文件实例
2014/09/16 Python
python中import学习备忘笔记
2017/01/24 Python
基于python时间处理方法(详解)
2017/08/14 Python
python实现最长公共子序列
2018/05/22 Python
numpy判断数值类型、过滤出数值型数据的方法
2018/06/09 Python
python二分法查找算法实现方法【递归与非递归】
2019/12/06 Python
Python编程快速上手——正则表达式查找功能案例分析
2020/02/28 Python
基于python实现FTP文件上传与下载操作(ftp&amp;sftp协议)
2020/04/01 Python
在Tensorflow中实现leakyRelu操作详解(高效)
2020/06/30 Python
Django model class Meta原理解析
2020/11/14 Python
杰夫·班克斯男士服装网上商店:Jeff Banks
2019/10/24 全球购物
高三体育教学反思
2014/01/29 职场文书
党员群众路线个人整改措施思想汇报
2014/10/12 职场文书
毛主席纪念堂观后感
2015/06/17 职场文书
副校长2015年教育教学工作总结
2015/07/27 职场文书
《孙子兵法》:欲成大事者,需读懂这些致胜策略
2019/08/23 职场文书
详解如何修改nginx的默认端口
2021/03/31 Servers
python中mongodb包操作数据库
2022/04/19 Python