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 httplib,smtplib使用方法
Sep 06 Python
Python升级导致yum、pip报错的解决方法
Sep 06 Python
从CentOS安装完成到生成词云python的实例
Dec 01 Python
浅谈Python黑帽子取代netcat
Feb 10 Python
PHP实现发送和接收JSON请求
Jun 07 Python
pyqt5移动鼠标显示坐标的方法
Jun 21 Python
python读取并定位excel数据坐标系详解
Jun 26 Python
使用Python的Turtle绘制哆啦A梦实例
Nov 21 Python
pandas分批读取大数据集教程
Jun 06 Python
Python连接mysql数据库及简单增删改查操作示例代码
Aug 03 Python
python解决OpenCV在读取显示图片的时候闪退的问题
Feb 23 Python
Python游戏开发实例之graphics实现AI五子棋
Nov 01 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获取根域名方法汇总
2014/10/28 PHP
PHP经典面试题之设计模式(经常遇到)
2015/10/15 PHP
PHP使用标准库spl实现的观察者模式示例
2018/08/04 PHP
thinkPHP+mysql+ajax实现的仿百度一下即时搜索效果详解
2019/07/15 PHP
tp5框架无刷新分页实现方法分析
2019/09/26 PHP
Extjs4 类的定义和扩展实例
2013/06/28 Javascript
javaScript NameSpace 简单说明介绍
2013/07/18 Javascript
JavaScript中的style.cssText使用教程
2014/11/06 Javascript
JavaScript操作Oracle数据库示例
2015/03/06 Javascript
手机端页面rem宽度自适应脚本
2015/05/20 Javascript
纯js代码实现简单计算器
2015/12/02 Javascript
Vue.js基础知识汇总
2016/04/27 Javascript
JS实现表单多文件上传样式美化支持选中文件后删除相关项
2016/09/30 Javascript
探讨跨域请求资源的几种方式(总结)
2016/12/02 Javascript
jQuery Validation Engine验证控件调用外部函数验证的方法
2017/01/18 Javascript
vue基于Element构建自定义树的示例代码
2017/09/19 Javascript
vue实现路由懒加载及组件懒加载的方式
2019/06/11 Javascript
JS开发 富文本编辑器TinyMCE详解
2019/07/19 Javascript
vue 父组件通过v-model接收子组件的值的代码
2019/10/27 Javascript
JS中锚点链接点击平滑滚动并自由调整到顶部位置
2021/02/06 Javascript
[56:58]VP vs Optic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
django中间键重定向实例方法
2019/11/10 Python
Python3与fastdfs分布式文件系统如何实现交互
2020/06/23 Python
英国复古服装和球衣购买网站:3Retro Football
2018/07/09 全球购物
英国100%防污和防水的靴子:Muck Boot Company
2020/09/08 全球购物
高一生物教学反思
2014/01/17 职场文书
《广玉兰》教学反思
2014/04/14 职场文书
小学美术兴趣小组活动总结
2014/07/07 职场文书
注册资产评估专业求职信
2014/07/16 职场文书
党的生日演讲稿
2014/09/10 职场文书
学习十八大标语
2014/10/09 职场文书
民主生活会发言材料
2014/10/20 职场文书
导游词之藏龙百瀑景区
2019/12/30 职场文书
vue实现滑动解锁功能
2022/03/03 Vue.js
golang生成vcf通讯录格式文件详情
2022/03/25 Golang
Java Redisson多策略注解限流
2022/09/23 Java/Android