国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python實(shí)現(xiàn)括號匹配的思路詳解

2020-02-15 22:48:30
字體:
供稿:網(wǎng)友

1.用一個(gè)棧【python中可以用List】就可以解決,時(shí)間和空間復(fù)雜度都是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 Trueprint(check("3 * {3 +[(2 -3) * (4+5)]}"))print(check("3 * {3+ [4 - 6}]"))

2.

# 存儲左括號和右括號open_brackets = '([{<'close_brackets = ')]}>'# 映射左右括號便于出棧判斷brackets_map = {')': '(', ']': '[', '}': '{', '>': '<'}# 對于每一行數(shù)據(jù),進(jìn)行如下判定若括號為左括號,加入棧,若括號為右括號,判斷是否跟棧尾括號對應(yīng), 若對應(yīng),彈出棧尾元素,若所有括號均正確閉合,則最后棧為空。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.

在長度很大的時(shí)候可以盡快判斷一些比較明顯的錯(cuò)誤的模式,節(jié)省時(shí)間:

主要的思路:

首先設(shè)置兩個(gè)列表分別存放的是各種括號的開括號和閉括號,然后遍歷給定的字符串,分如下幾種情況:

1.字符串 首字符 出現(xiàn)在閉括號列表中,直接結(jié)束,輸出錯(cuò)誤
2.字符串長度不為偶數(shù),直接結(jié)束,輸出錯(cuò)誤
3.對原始字符串列表化去重,如果去重后的列表長度不為偶數(shù)直接結(jié)束,輸出錯(cuò)誤
4.遍歷字符串,將屬于開括號集合的括號加入到列表中,當(dāng)遇上一個(gè)閉括號的時(shí)候計(jì)算該閉括號在閉括號列表中的索引與

當(dāng)前列表最后一個(gè)開括號在開括號列表中的索引是否一致,一致則繼續(xù),否則直接結(jié)束,輸出錯(cuò)誤

#!usr/bin/env python# encoding:utf-8def 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 Trueif __name__ == '__main__':  one_str_list = ['({})', '({[<《》>]})', '[(]){}', '{{{{{{', '([{}])', '}{[()]']  for one_str in one_str_list:    if bracket_mathch(one_str):      print(one_str, '正確')    else:      print(one_str, '錯(cuò)誤')  tmp = '{}[{()()[]<{{[[[[(())()()(){}[]{}[]()<>]]]]}}>}]'  print(bracket_mathch(tmp))            
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 清河县| 东乌珠穆沁旗| 澎湖县| 分宜县| 青神县| 玉树县| 阿勒泰市| 无为县| 香港| 临西县| 佳木斯市| 平武县| 合阳县| 建水县| 枣强县| 滕州市| 新安县| 淮阳县| 南丰县| 田林县| 台前县| 天水市| 江城| 衡阳县| 麦盖提县| 鹤峰县| 本溪| 成安县| 乡宁县| 潜山县| 淅川县| 梅河口市| 龙山县| 蛟河市| 汉阴县| 顺义区| 青浦区| 饶平县| 新乐市| 阿勒泰市| 耒阳市|