删除最外层的括号

简介: 删除最外层的括号

说在前面

🎈 算法并不一定都是很难的题目,也有很多只是一些代码技巧,多进行一些算法题目的练习,可以帮助我们开阔解题思路,提升我们的逻辑思维能力,也可以将一些算法思维结合到业务代码的编写思考中。简而言之,平时进行的算法习题练习带给我们的好处一定是不少的,所以让我们一起来养成算法练习的习惯。今天练习的题目是一道比较简单的题目 ->删除最外层的括号

问题描述

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

  • 例如,"""()""(())()""(()(()))" 都是有效的括号字符串。

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

给出一个非空有效字符串 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 是一个有效括号字符串

思路分析

首先我们应该先理解一下题目意思,题目会给我们一个字符串,字符串仅由 () 组成,我们需要删除每个原语字符串的最外层括号,所以我们需要先理解一下什么是原语字符串,题目中说道:如果有效字符串 s 非空,且不存在将其拆分为 s = A + B 的方法,我们称其为原语(primitive) ,其中 AB 都是非空有效括号字符串。也就是说原语是由多个有效括号字符串拼接而成,所以我们需要进一步理解什么是有效括号字符串,这里的有效括号字符串表示一个完整闭合的括号字符串,例如:"""()""(())()""(()(()))" 都是有效的括号字符串。

理解了题目说到的各个名词的意思之后,我们便可以开始进行解题了,我们需要先将字符串原语化,也即是找出字符串中所有的有效括号字符串,再将每个有效括号字符串的最外层删除后再拼接起来即可。

因为题目中说到: s 是一个有效括号字符串,所以我们只需要遍历字符串,统计当前遍历过的左括号和右括号的数量,当左括号数量与右括号数量相等时,则说明当前部分为一个有效的括号字符串,去掉其最外层的括号,拼接到结果字符串即可。

AC 代码

完整代码如下:

/**
 * @param {string} s
 * @return {string}
 */
var removeOuterParentheses = function (s) {
  let res = "",
    cnt = 0;
  let tmp = "";
  for (let i = 0; i < s.length; i++) {
    if(s[i] === ')') cnt--;
    if (cnt == 0) {
      res += tmp;
      tmp = "";
    }
    if (cnt > 0) tmp += s[i];
    if(s[i] === '(') cnt++;
  }
  return res;
};

公众号

关注公众号『前端也能这么有趣』,获取更多新鲜内容。

说在后面

🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。

目录
相关文章
|
6月前
|
Python
循环的嵌套
在编程中,循环结构是一种非常重要的控制结构,用于重复执行一段代码。而循环的嵌套则是指在一个循环内部又包含了另一个或多个循环,使得代码的执行更加复杂和灵活。本文将介绍循环嵌套的概念、使用场景以及示例代码。
91 1
|
6月前
leetcode-301:删除无效的括号
leetcode-301:删除无效的括号
48 0
|
2月前
|
C语言 索引 Python
利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
35 4
|
4月前
|
语音技术 Python
语音识别,range语句,range语句=生成数字序列,for循环临时变量作用域,for循环临时变量作用域,for循环的变量作用域只能在for内部用,for循环的嵌套使用,for循环打印九九乘法表
语音识别,range语句,range语句=生成数字序列,for循环临时变量作用域,for循环临时变量作用域,for循环的变量作用域只能在for内部用,for循环的嵌套使用,for循环打印九九乘法表
|
5月前
|
程序员
数组与使用范围及循环变量不同的写法
数组与使用范围、下标、指针的for循环及循环变量不同的类型声明
|
5月前
for循环嵌套for循环与递归的区别
for循环嵌套for循环与递归的区别
|
4月前
|
语音技术 数据安全/隐私保护
语音识别,猜猜心里数字讲解,猜数字的组合,判断语句的嵌套,嵌套语句使用很简单,我们写一个外层嵌套的条件,利用缩进,满足条件,才会执行条件2,判断语句综合案例,如何产生变量的随机数字,while循环应用
语音识别,猜猜心里数字讲解,猜数字的组合,判断语句的嵌套,嵌套语句使用很简单,我们写一个外层嵌套的条件,利用缩进,满足条件,才会执行条件2,判断语句综合案例,如何产生变量的随机数字,while循环应用
|
6月前
for循环去掉最后一个逗号(三种方法)
for循环去掉最后一个逗号(三种方法)
82 1
for循环去掉最后一个逗号(三种方法)
|
6月前
|
算法 测试技术 C#
【字符串】【括号匹配】【广度优先】301. 删除无效的括号
【字符串】【括号匹配】【广度优先】301. 删除无效的括号
【字符串】【括号匹配】【广度优先】301. 删除无效的括号
|
6月前
|
C++
HRBUST - 1170(判断括号是否匹配)
HRBUST - 1170(判断括号是否匹配)