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根据距离和时长计算配速示例
Feb 16 Python
python实现自动发送邮件发送多人、群发、多附件的示例
Jan 23 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
Jan 15 Python
python实现爬取百度图片的方法示例
Jul 06 Python
python搜索包的路径的实现方法
Jul 19 Python
python中的subprocess.Popen()使用详解
Dec 25 Python
python全局变量引用与修改过程解析
Jan 07 Python
python内打印变量之%和f的实例
Feb 19 Python
Python中zip函数如何使用
Jun 04 Python
Django如何在不停机的情况下创建索引
Aug 02 Python
VSCODE配置Markdown及Markdown基础语法详解
Jan 19 Python
Python 正则模块详情
Nov 02 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 REMOTE_ADDR之获取访客IP的代码
2008/04/22 PHP
7个超级实用的PHP代码片段
2011/07/11 PHP
php使用GD库创建图片缩略图的方法
2015/06/10 PHP
PHP按指定键值对二维数组进行排序的方法
2015/12/22 PHP
php操作mongodb封装类与用法实例
2018/09/01 PHP
PHP实现微信对账单处理
2018/10/01 PHP
php实现映射操作实例详解
2019/10/02 PHP
javascript 去字符串空格终极版(支持utf8)
2009/11/14 Javascript
解析javascript 实用函数的使用详解
2013/05/10 Javascript
jquery+html5时钟特效代码分享(可设置闹钟并且语音提醒)
2020/03/30 Javascript
jQuery EasyUI学习教程之datagrid点击列表头排序
2016/07/09 Javascript
vue计算属性时v-for处理数组时遇到的一个bug问题
2018/01/21 Javascript
jQuery实现的滑块滑动导航效果示例
2018/06/04 jQuery
JS+HTML实现的圆形可点击区域示例【3种方法】
2018/08/01 Javascript
vue使用pdfjs显示PDF可复制的实现方法
2018/12/14 Javascript
cocos2dx+lua实现橡皮擦功能
2018/12/20 Javascript
javascript设计模式 ? 迭代器模式原理与用法实例分析
2020/04/17 Javascript
JS算法教程之字符串去重与字符串反转
2020/12/15 Javascript
简单的Python2.7编程初学经验总结
2015/04/01 Python
MySQL最常见的操作语句小结
2015/05/07 Python
Python迭代和迭代器详解
2016/11/10 Python
每天迁移MySQL历史数据到历史库Python脚本
2018/04/13 Python
python+pandas+时间、日期以及时间序列处理方法
2018/07/10 Python
Python动态生成多维数组的方法示例
2018/08/09 Python
TensorFlow实现iris数据集线性回归
2018/09/07 Python
如何用Python来理一理红楼梦里的那些关系
2019/08/14 Python
Python PO设计模式的具体使用
2019/08/16 Python
python3 中时间戳、时间、日期的转换和加减操作
2020/07/14 Python
使用css3和jquery实现可伸缩搜索框
2014/02/12 HTML / CSS
css3 media 响应式布局的简单实例
2016/08/03 HTML / CSS
什么是java序列化,如何实现java序列化
2012/11/14 面试题
物业管理个人自我评价
2013/11/08 职场文书
影视艺术学院毕业生自荐信
2013/11/13 职场文书
小学生作文批改评语
2014/12/25 职场文书
OpenCV-Python模板匹配人眼的实例
2021/06/08 Python
MySQL安装失败的原因及解决步骤
2022/06/14 MySQL