返回
LeetCode 1249:详解如何巧妙地从字符串中剔除无效括号
前端
2023-10-25 04:04:51
序言
括号在计算机科学中有着广泛的应用,用于表示代码块、函数调用和数据结构。然而,无效的括号会造成程序错误和逻辑缺陷。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 题通过要求我们识别并剔除无效括号,考察了我们对字符串操作和数据结构的理解。通过结合栈和迭代技术,我们可以高效地解决这个问题,获得最长的有效括号子字符串。本篇解析深入阐述了算法思想和执行步骤,希望能帮助读者轻松掌握此算法。