返回

LeetCode 1249:详解如何巧妙地从字符串中剔除无效括号

前端

序言

括号在计算机科学中有着广泛的应用,用于表示代码块、函数调用和数据结构。然而,无效的括号会造成程序错误和逻辑缺陷。LeetCode 1249 题旨在考察我们识别和处理无效括号的能力。

问题

给定一个仅包含左括号 '(' 和右括号 ')' 的字符串 s,要求找出最长的有效括号子字符串,并将其余无效括号全部剔除。

解决方案:栈 + 迭代

解决此问题的一种有效方法是结合栈和迭代技术。具体步骤如下:

第一步:字符串转数组

将给定的字符串 s 转换为一个字符数组 chs,便于操作和遍历。

第二步:遍历数组

使用一个循环逐个遍历 chs 中的每个字符 c:

  • 如果 c 为 '(':
    • 将 c 对应的索引 i 压入栈中。
  • 如果 c 为 ')':
    • 如果栈为空,则说明遇到无效的右括号。将 chs[i] 置为空字符,以示无效。
    • 否则,从栈中弹出顶部元素的索引 j。
    • 考察 chs[i] 和 chs[j] 是否为一对有效的括号(即:'(' 和 ')')。如果是,则将它们标记为有效。

第三步:构造结果字符串

遍历 chs,将标记为有效的括号字符逐个添加到结果字符串 res 中。

示例:

输入字符串:s = "(())()(()"

执行步骤:

  • 将 s 转换为字符数组 chs。
  • 遍历 chs:
    • (1): chs[0] = '(',压入栈中。
    • (2): chs[1] = '(', 压入栈中。
    • (3): chs[2] = ')', 栈不为空,弹出栈顶元素 1。chs[1] 和 chs[2] 匹配成功,标记为有效。
    • (4): chs[3] = ')', 栈不为空,弹出栈顶元素 0。chs[0] 和 chs[3] 匹配成功,标记为有效。
    • (5): chs[4] = '(', 压入栈中。
    • (6): chs[5] = '(', 压入栈中。
    • (7): chs[6] = ')', 栈不为空,弹出栈顶元素 5。chs[5] 和 chs[6] 匹配成功,标记为有效。
    • (8): chs[7] = ')', 栈不为空,弹出栈顶元素 4。chs[4] 和 chs[7] 匹配成功,标记为有效。
  • 构造结果字符串 res:res = "()()()"

时间复杂度:O(n) ,其中 n 为字符串 s 的长度。

结论

LeetCode 1249 题通过要求我们识别并剔除无效括号,考察了我们对字符串操作和数据结构的理解。通过结合栈和迭代技术,我们可以高效地解决这个问题,获得最长的有效括号子字符串。本篇解析深入阐述了算法思想和执行步骤,希望能帮助读者轻松掌握此算法。