[路飞]_leetcode-1021-删除最外层的括号

简介: leetcode-1021-删除最外层的括号

网络异常,图片无法展示
|


[题目地址][B站地址]


有效括号字符串为空 """(" + 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 是一个有效括号字符串


本题就是要我们把输入字符串中所有的最外层括号删除,那想要删除所有的最外层括号,最简单的方法将输入字符串按最外层括号拆分为多个子串放入数组


然后循环数组,将每个子串的最外层括号删除,最后将剩余子串连接即可组成结果字符串

但是这种操作需要进行两次循环,并不是本题的最优解法


我们可以在一次循环输入字符串的过程中,直接拆解出需要的结果字符串


解题思路如下:


  1. 初始化 l = 0 记录左括号数量,r = 0 记录右括号数量,left = 0 记录本次区间开始下标,res = "" 记录结果字符串
  2. 遍历字符串,并更新相关变量。当当前字符为 ( 的时候,l++,反之 r++
  3. l === r 的时候,说明找到了一组最外层括号,此时 left 下标指向左括号下标,当前遍历下标 i 指向右括号下标,截取两下标中间部分字符,即为我们需要的结果字符串的一部分
  4. 重置 l = 0,r = 0,left = i+1,重复以上过程,直到输入字符串遍历完成
  5. 此时 res 中保存的就是求得的结果字符串


整体过程如下:


网络异常,图片无法展示
|


代码如下:


var removeOuterParentheses = function(s) {
  // 记录左括号数量
  let l = 0,
  // 记录右括号数量
  r = 0,
  本次区间开始下标
  left = 0,
  // 结果字符串
  res = '';
  // 遍历输入字符串
  for(let i = 0;i<s.length;i++){
    // 更新左右括号数量
    if(s[i]==='(') l++;
    else r++;
    // 当左右括号数量相同,说明此时找到了最外层括号
    if(l===r){
      // 截取当前最外层括号的内部字符串
      res += s.substring(left+1,i);
      // 重置左右括号数量为0
      l = 0;
      r = 0;
      // 更新开始下标为下一个最外层括号的开始下标
      left = i+1;
    }
  }
  // 返回结果字符串
  return res;
};
复制代码


至此我们就完成了 leetcode-1021-删除最外层的括号


如有任何问题或建议,欢迎留言讨论!

相关文章
|
8月前
|
存储 C语言 索引
环形链表、环形链表 II、有效的括号​​​​​​​【LeetCode刷题日志】
环形链表、环形链表 II、有效的括号​​​​​​​【LeetCode刷题日志】
|
2月前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
3月前
|
算法 C++
Leetcode第二十二题(括号生成)
这篇文章讨论了如何使用递归算法解决LeetCode第22题“括号生成”的问题,提供了两种C++的实现方法,目的是生成所有有效的括号组合。
23 0
Leetcode第二十二题(括号生成)
|
3月前
|
存储 C++ 容器
Leetcode第二十题(有效的括号)
这篇文章介绍了如何使用栈来解决LeetCode第20题“有效的括号”问题,提供了两种方法:数组栈和容器栈,以及相应的C++代码实现。
23 0
|
5月前
|
算法
LeetCode第22题括号生成
该文章介绍了 LeetCode 第 22 题括号生成的解法,通过回溯算法生成所有可能的括号组合,在递归过程中根据左右括号数量的条件进行剪枝,从而得到有效的括号组合。
LeetCode第22题括号生成
|
5月前
|
存储 算法
LeetCode第20题有效的括号
该文章介绍了 LeetCode 第 20 题有效的括号的解法,通过分析有效括号的特征,使用栈结构存储括号关系,判断遇到右边括号时栈顶是否有匹配的左边括号,从而解决问题,同时总结了栈的先进后出结构可用于解决有规律的符号匹配问题。
LeetCode第20题有效的括号
|
5月前
|
算法 Python
【Leetcode刷题Python】括号匹配问题
一种解决括号匹配问题的Python实现方法,通过计算给定括号串的所有子串的最长合法括号子序列长度之和来确定权值。
34 0
|
5月前
|
机器学习/深度学习 Python
【Leetcode刷题Python】22. 括号生成
本文介绍了了LeetCode题目22的两种Python编程解决方案,题目要求生成所有可能的且有效的括号组合,包括暴力求解和回溯方法。
29 0
|
5月前
|
Python
【Leetcode刷题Python】20. 有效的括号
LeetCode上题目“20. 有效的括号”的Python解决方案,使用栈数据结构来验证括号序列的有效性。具体实现中,会在栈中预先放置一个特殊字符以避免在弹出操作时出现空栈错误,并通过匹配左右括号来判断括号序列是否有效。
52 0
|
7月前
|
算法 Java C语言
【经典算法】LeetCode 20:有效的括号(Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode 20:有效的括号(Java/C/Python3实现含注释说明,Easy)
58 1