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正常时间和unix时间戳相互转换的方法
Apr 23 Python
基于python select.select模块通信的实例讲解
Sep 21 Python
python获取酷狗音乐top500的下载地址 MP3格式
Apr 17 Python
详解Python中的四种队列
May 21 Python
python实现图片批量压缩程序
Jul 23 Python
解决python flask中config配置管理的问题
Jul 26 Python
python实现修改固定模式的字符串内容操作示例
Dec 30 Python
Tensorflow轻松实现XOR运算的方式
Feb 03 Python
Python Socketserver实现FTP文件上传下载代码实例
Mar 27 Python
python 解决Fatal error in launcher:错误问题
May 21 Python
keras 解决加载lstm+crf模型出错的问题
Jun 10 Python
python Gabor滤波器讲解
Oct 26 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
Terran历史背景
2020/03/14 星际争霸
操作Oracle的php类
2006/10/09 PHP
php代码把全角数字转为半角数字
2007/12/10 PHP
php遍历CSV类实例
2015/04/14 PHP
PHP生成随机字符串(3种方法)
2015/09/25 PHP
使用ucenter实现多站点同步登录的讲解
2019/03/21 PHP
Jquery cookie操作代码
2010/03/14 Javascript
常用的JS验证和函数汇总
2014/12/23 Javascript
JavaScript编程中容易出BUG的几点小知识
2015/01/31 Javascript
jQuery中过滤器的基本用法示例
2017/10/11 jQuery
Vue 动态设置路由参数的案例分析
2018/04/24 Javascript
vue form check 表单验证的实现代码
2018/12/09 Javascript
node.js监听文件变化的实现方法
2019/04/17 Javascript
使用layui+ajax实现简单的菜单权限管理及排序的方法
2019/09/10 Javascript
JavaScript基于面向对象实现的无缝滚动轮播示例
2020/01/17 Javascript
JavaScript如何实现防止重复的网络请求的示例
2021/01/28 Javascript
[04:50]2019DOTA2高校联赛秋季赛四强集锦
2019/12/27 DOTA
python概率计算器实例分析
2015/03/25 Python
对Python新手编程过程中如何规避一些常见问题的建议
2015/04/01 Python
Python中的ConfigParser模块使用详解
2015/05/04 Python
Python的多态性实例分析
2015/07/07 Python
简单的Apache+FastCGI+Django配置指南
2015/07/22 Python
python @property的用法及含义全面解析
2018/02/01 Python
Python编程argparse入门浅析
2018/02/07 Python
python web基础之加载静态文件实例
2018/03/20 Python
解决django model修改添加字段报错的问题
2019/11/18 Python
css3+伪元素实现鼠标移入时下划线向两边展开的效果
2017/04/25 HTML / CSS
I.T集团香港官方商城:ITeSHOP.com Hong Kong
2019/02/15 全球购物
西班牙品牌鞋子、服装和配饰在线商店:Esdemarca
2021/02/17 全球购物
入党积极分子思想汇报范文
2014/01/05 职场文书
网络事业创业计划书范文
2014/01/09 职场文书
2014年大学生党课心得体会范文
2014/03/29 职场文书
综合实践活动总结
2014/05/05 职场文书
商业街策划方案
2014/05/31 职场文书
会计工作能力自我评价
2015/03/05 职场文书
秋季运动会加油词
2015/07/18 职场文书