leetcode 1021. 删除最外层的括号

105 阅读1分钟

[toc] leetcode 1021. 删除最外层的括号

题目描述

  1. 删除最外层的括号

有效括号字符串为空 ""、"(" + A + ")" 或 A + B ,其中 A 和 B 都是有效的括号字符串,+ 代表字符串的连接。

例如,"","()","(())()" 和 "(()(()))" 都是有效的括号字符串。 如果有效字符串 s 非空,且不存在将其拆分为 s = A + B 的方法,我们称其为原语(primitive),其中 A 和 B 都是非空有效括号字符串。

给出一个非空有效字符串 s,考虑将其进行原语化分解,使得:s = P_1 + P_2 + ... + P_k,其中 P_i 是有效括号字符串原语。

对 s 进行原语化分解,删除分解中每个原语字符串的最外层括号,返回 s 。

示例 1:

输入:s = "(()())(())" 输出:"()()()" 解释: 输入字符串为 "(()())(())",原语化分解得到 "(()())" + "(())", 删除每个部分中的最外层括号后得到 "()()" + "()" = "()()()"。 示例 2:

输入:s = "(()())(())(()(()))" 输出:"()()()()(())" 解释: 输入字符串为 "(()())(())(()(()))",原语化分解得到 "(()())" + "(())" + "(()(()))", 删除每个部分中的最外层括号后得到 "()()" + "()" + "()(())" = "()()()()(())"。 示例 3:

输入:s = "()()" 输出:"" 解释: 输入字符串为 "()()",原语化分解得到 "()" + "()", 删除每个部分中的最外层括号后得到 "" + "" = ""。

提示:

1 <= s.length <= 105 s[i] 为 '(' 或 ')' s 是一个有效括号字符串

解题思路

法1

计数:

遍历输入字符串 s 中的每个字符,并使用一个计数器 count 来记录当前遍历到的括号的层数。

如果遇到左括号 '(',并且计数器 count 大于 0,表示该左括号不是最外层的括号,需要将其添加到结果字符串 result 中。

如果遇到右括号 ')',则将计数器 count 减 1,并且如果计数器 count 大于 0,表示该右括号不是最外层的括号,需要将其添加到结果字符串 result 中。

最终,遍历完整个字符串后,结果字符串 result 中就是去除了最外层括号的字符串。

  • 时间复杂度(O())
  • 空间复杂度(O())

执行结果

法1

func removeOuterParentheses(s string) string {
	result := ""
	count := 0

	for _, c := range s {
		if c == '(' {
			if count > 0 {
				result += string(c)
			}
			count++
		} else if c == ')' {
			count--
			if count > 0 {
				result += string(c)
			}
		}
	}

	return result
}

执行结果: 通过 显示详情 查看示例代码 添加备注

执行用时: 4 ms , 在所有 Go 提交中击败了 48.00% 的用户 内存消耗: 7.3 MB , 在所有 Go 提交中击败了 10.00% 的用户 通过测试用例: 59 / 59 炫耀一下:

本文由mdnice多平台发布