暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

夯实基础---烧脑第4波来袭

coolpython 2017-03-08
115

今天上一个难度,请听题

给出一个字符串,其中只包含括号(大中小括号 “()[]{}” ),括号可以任意嵌套。如果同样的左右括号成对出现并且嵌套正确,那么认为它是匹配的。例如:

1()  ->  TRUE  (匹配)

2、[()]  ->  TRUE  (匹配,括号可以嵌套)

3、()()   ->  TRUE     (匹配,括号可以并列排列)

4、({}([]))  ->  TRUE   (匹配,括号可以任意嵌套,大括号不必在外)

5、)   ->  FALSE    (不匹配,缺少左括号)

6、(}   ->  FALSE     (不匹配,左右括号不一样)

7、{)(}   ->  FALSE     (不匹配,左右括号相反)

思路分析
  • 由于嵌套是随意的,因此不能像剥洋葱一样从最外层剥

  • 不管如何嵌套,总会有至少一对括号里面是不嵌套任何字符串的

  • 遇到一个 ( 时,不可能去找与它对应的  ) ,因为 ) 很可能有多个,哪个是与之对应的呢,这个思路非常麻烦

有一种名为“栈”的数据结构,它的特点是先进后出,而list就可以伪装成一个栈,利用先进后出的特性,将左右两个括号抵消掉,文字已经不能解释清楚了,还是上代码吧

示例代码

#coding=utf-8
str_value = '({}([]))'
lst = list(str_value)
lst_compare = []
b_format = True
for item in lst:
   if item == '(' or item == '{' or item == '[':
       lst_compare.append(item)

   if len(lst_compare) == 0:
       b_format = False
       break

   if item == ')':
       if lst_compare[-1] == '(':
           lst_compare.pop()
       else:
           b_format = False

   if item == ']':
       if lst_compare[-1] == '[':
           lst_compare.pop()
       else:
           b_format = False

   if item == '}':
       if lst_compare[-1] == '{':
           lst_compare.pop()
       else:
           b_format = False

复制

if not len(lst_compare) == 0:
       b_format = False

复制

if b_format:
   print u'格式正确'
else:
   print u'格式错误'

复制

代码解析
  • 首先要明白第二行所使用的lis方法的作用,它将字符串转成一个list

  • 对lst进行遍历,将遍历得到的各种左括号放入st_compare 中

  • 在对lst进行遍历过程中,如果遇到一种右括号,则和st_compare中末尾的元素比较,判断他们是不是一对,如果是一对,则是用pop方法把st_compare末尾的元素弹出来,如果不是,就说明括号不是成对出现的

  • 如果最终st_compare的长度不为0,就说明有一些左括号是没有被抵消掉的,格式必然不正确

文章转载自coolpython,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论