本文实例讲述了Python实现求解括号匹配问题的方法。分享给大家供大家参考,具体如下:
这个在本科学习数据结构的时候已经接触很多了,主流的思想是借助栈的压入、弹出来进行匹配,至于python的话可以使用列表来完成这个操作,因为列表的append
方法相当于栈的push
方法,列表的pop
方法相当于栈的pop
方法。
主要的思路:
首先设置两个列表分别存放的是各种括号的开括号和闭括号,然后遍历给定的字符串,分如下几种情况:
1.字符串首字符出现在闭括号列表中,直接结束,输出错误
2.字符串长度不为偶数,直接结束,输出错误
3.对原始字符串列表化去重,如果去重后的列表长度不为偶数直接结束,输出错误
4.遍历字符串,将属于开括号集合的括号加入到列表中,当遇上一个闭括号的时候计算该闭括号在闭括号列表中的索引与当前列表最后一个开括号在开括号列表中的索引是否一致,一致则继续,否则直接结束,输出错误
主要是在长度很大的时候可以尽快判断一些比较明显的错误的模式,节省时间,按照这个简单的思想,下面是具体的实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
#!usr/bin/env python #encoding:utf-8 ''''' __Author__:沂水寒城 功能:括号匹配的相关问题 ''' 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程序设计有所帮助。
原文链接:https://blog.csdn.net/together_cz/article/details/76732317