最长括号匹配 示例:

给定字符串,仅包含左括号‘(’和右括号‘)’,它可能不是括号匹配的,设计算法,找出最长匹配的括号子串。

算法分析

只有在右括号和左括号发生匹配时,才有可能更新最终解。
计算s[0…i]中左括号数目与右括号数目的差x,若x为0时,考察最终解是否可以更新,
这个差x是入栈的数目,代码中用“深度”deep表达。
由于可能出现左右括号不相等——尤其是左括号数目大于右括号数目,所以,再从右向左扫描一次。
用deep值替换stack栈,空间复杂度由O(N)降到O(1)。

Python代码如下:

def match_longest_parentheses(s):size = len(s)li = []  # 记录最长结果的字符串索引,例如:对于"()(()"则返回[[0, 1], [3, 4]]deep = 0  # 遇到多少左括号start = 0  # 最深的(deep=0 时)左括号的位置for i in range(size):if s[i] == '(':deep += 1else:  # s[i] == ')'deep -= 1if deep == 0:if len(li) == 0 or li[0][1] - li[0][0] < i - start:li = [[start, i]]elif li[0][1] - li[0][0] == i - start:li.append([start, i])elif deep < 0:  # 说明右括号数目大于左括号数目deep = 0start = i + 1deep = 0  # 遇到多少右括号start = size - 1  # 最深的(deep=0 时)右括号的位置for i in range(size - 1, -1, -1):if s[i] == ')':deep += 1else:  # s[i] == '('deep -= 1if deep == 0:if len(li) == 0 or li[0][1] - li[0][0] < start - i:li = [[i, start]]elif li[0][1] - li[0][0] == start - i and not li.__contains__([i, start]):li.append([i, start])elif deep < 0:  # 说明左括号数目大于右括号数目deep = 0start = i - 1return liif __name__ == '__main__':s = '()(()))(((((()))'print('字符串:%s' % s)li = match_longest_parentheses(s)print('最长括号索引:%s' % li)ss = [s[i[0]:i[1] + 1] for i in li]print('最长括号:%s' % ','.join(ss))

输出结果:

字符串:()(()))(((((()))
最长括号索引:[[0, 5], [10, 15]]
最长括号子串:()(()),((()))

【Python】最长括号匹配问题:给定字符串,仅包含左括号‘(’和右括号‘)’,它可能不是括号匹配的,设计算法,找出最长匹配的括号子串相关推荐

  1. java小编程----给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。

    package com.henu;import java.util.Arrays;/*** @author limengdong* @date 2019年7月19日* @classroom 208bi ...

  2. 算法---给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合

    题目 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合.答案可以按 任意顺序 返回.给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母.示例 1:输入:digits ...

  3. 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

    电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23" ...

  4. LeetCode 5485. 找出最长的超赞子字符串 (状态压缩、二进制、位运算、前缀和)

    5485. 找出最长的超赞子字符串 题意: 给你一个字符串 s .请返回 s 中最长的 超赞子字符串 的长度. 「超赞子字符串」需满足满足下述两个条件: 该字符串是 s 的一个非空子字符串 进行任意次 ...

  5. 1542. 找出最长的超赞子字符串 哈希+状态压缩

    1542. 找出最长的超赞子字符串 给你一个字符串 s .请返回 s 中最长的 超赞子字符串 的长度. 「超赞子字符串」需满足满足下述两个条件: 该字符串是 s 的一个非空子字符串 进行任意次数的字符 ...

  6. leetcode 5485. 找出最长的超赞子字符串

    5485. 找出最长的超赞子字符串 给你一个字符串 s .请返回 s 中最长的 超赞子字符串 的长度. 「超赞子字符串」需满足满足下述两个条件: 该字符串是 s 的一个非空子字符串 进行任意次数的字符 ...

  7. 判断字母数字下划线python_如何验证Python中的字符串仅包含字母,数字,下划线和破折号?...

    您可以使用正则表达式来完成此任务.为了验证字符串仅包含字母,数字,下划线和破折号,我们可以使用以下正则表达式:" ^ [A-Za-z0-9 _-] * $". 示例import r ...

  8. (C/C++)给定两个长度为m和n的有序列表,以O(logm+logn)复杂度找出有序列表第k小的数

    给定两个长度为m和n的有序列表,以O(logm+logn)复杂度找出有序列表第k小的数 思路 logm+logn即可推断是分治,每次折半得到两个数组的A[midA]和B[midB],有: A[midA ...

  9. 检查Python列表项是否在另一个字符串中包含一个字符串

    我有一个清单: my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456'] 并要搜索包含字符串'abc' . 我怎样才能做到这一点? if 'abc' ...

最新文章

  1. usaco Ordered Fractions 顺序的分数(两种解法)
  2. 硬刚一周,3W字总结,一年的经验告诉你如何准备校招!
  3. asp.net网站安全常见问题与防范
  4. java中函数的表达,如何表达“用T作为参数|的函数字符串,它是TypeScript中T“的键...
  5. 分类算法之决策树C4.5算法
  6. access和python哪个难学-access和python学哪个好一点
  7. [包计划] node-fs-extra
  8. php上传中文图片,用PHP处理图片文件的上传
  9. c语言学习-使用指针对三个变量互相赋值
  10. 腾讯225页报告:AI正取代互联网成为新引擎,马化腾提七大关键词
  11. Python socket non-blocking with SSL 的问题
  12. C#数组和list集合的区别
  13. lisp 车位块自动编号_CAD如何生成自动编号
  14. 发票查验API,批量查验发票真伪
  15. Postfix邮箱(八):安装反垃圾邮件系统Spam Locker
  16. 通过ext排查MySQL服务器间歇性卡顿问题
  17. 小程序源码放自己服务器上,小程序源码怎么安装到自己服务器?
  18. java minma_Java Core.minMaxLoc方法代码示例
  19. 四十八个音素发音方法
  20. python认证证书有哪些-国家认证的Python技术工程师有什么能力要求?

热门文章

  1. 吃:第二次去吃香草香草
  2. 从你的全世界路过-Freedom
  3. 【5万字】文件增量复制【OS库、Tkinter库等】
  4. Linux多定时器的实现之一
  5. python中单引号、双引号、三引号理解
  6. STM32配置CH375B成HID Host模式读取自定义HID设备的数据 ——STM32配置CH375B接口函数
  7. 说起刘慈欣,不要只知道《三体》和《流浪地球》
  8. 科沃斯擦窗机器人擦不干净怎么办_科沃斯窗宝能擦到玻璃的边角么想买个擦窗机器人,就是担心擦不干净,尤其是窗子边角的地方,要是还要人返工,那不如找钟点工来擦了...
  9. 浮萍自动清理机器人——第一次下水201606
  10. 家用计算机的普及英语作文,优秀高二英语作文:计算机