[路飞]_leetcode-1249-移除无效的括号

简介: leetcode-1249-移除无效的括号

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


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


给你一个由 '('')' 和小写字母组成的字符串 s


你需要从字符串中删除最少数目的 '(' 或者 ')' (可以删除任意位置的括号),使得剩下的「括号字符串」有效。


请返回任意一个合法字符串。


有效「括号字符串」应当符合以下 任意一条 要求:


  • 空字符串或只包含小写字母的字符串
  • 可以被写作 ABA 连接 B)的字符串,其中 AB 都是有效「括号字符串」
  • 可以被写作 (A) 的字符串,其中 A 是一个有效的「括号字符串」


示例 1:


输入: s = "lee(t(c)o)de)"
输出: "lee(t(c)o)de"
解释: "lee(t(co)de)" , "lee(t(c)ode)" 也是一个可行答案。
复制代码


示例 2:


输入: s = "a)b(c)d"
输出: "ab(c)d"
复制代码


示例 3:


输入: s = "))(("
输出: ""
解释: 空字符串也是有效的
复制代码


示例 4:


输入: s = "(a(b(c)d)"
输出: "a(b(c)d)"
复制代码


提示:


  • 1 <= s.length <= 10^5
  • s[i] 可能是 '('')' 或英文小写字母


本题要求将输入字符串中无效的括号删除


涉及到括号匹配的问题,都可以借助栈来解题


因为栈的性质为先进后出,所以当用栈来维护左括号的时候,遇到右括号的时候,如果栈不为空,则栈顶元素就是当前右括号对应的左括号


本题同样利用该技巧,在遍历输入字符串的过程中,如果当前字符为左括号,将对应下标压入栈中


如果当前字符为右括号,判断栈是否为空


如果栈不为空,则栈顶元素为当前右括号对应的左括号,将栈顶元素弹出,继续遍历


如果栈为空,则说明当前右括号没有与之匹配的左括号,则该右括号为无效括号,将其从输入字符串中删除


如果当前字符为小写字符,无需任何操作,继续遍历


这样当遍历完输入字符串,就删除了所有无效右括号,此时如果栈不为空,则栈中保存到就是所有无效左括号的下标


将栈顶元素弹出,并将输入字符串中对应字符删除,直到栈为空


最后返回处理后的输入字符串即可


过程演示如下:


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


代码如下:


var minRemoveToMakeValid = function(s) {
  // 初始化栈,存储左括号下标
  const stack = [];
  // 遍历输入字符串
  for(let i = 0;i<s.length;i++){
    // 如果是左括号,将下标入栈
    if(s[i]==='('){
      stack.push(i)
    }else if(s[i]===')'){
      // 如果是右括号
      // 如果栈不为空,说明栈顶左括号为该右括号对应左括号,将栈顶元素弹出
      if(stack.length) stack.pop();
      // 如果栈为空,说明当前右括号为多余右括号,将其删除
      else{
        s = s.substring(0,i)+s.substring(i+1);
        i--;
      }
    }
  }
  // 遍历完后,如果栈不为空,说明栈中为多余左括号的下标,将对应字符删除
  while(stack.length){
    const ind = stack.pop();
    s = s.substring(0,ind)+s.substring(ind+1)
  }
  // 返回处理后的字符串
  return s;
};
复制代码


至此我们就完成了 leetcode-1249-移除无效的括号


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

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