LeetCode.1021-删除最外面的括号(Remove Outermost Parentheses)

这是小川的第380次更新,第408篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第242题(顺位题号是1021)。有效的括号字符串为空("")"("+ A +")"A + B,其中A和B是有效的括号字符串,+表示字符串连接。例如,"""()""(())()""(()(()))"都是有效的括号字符串。

如果有效的括号字符串S是非空的,并且不存在将其拆分为S = A + B的方法,其中A和B是非空有效括号字符串,则它是原始的。

给定有效的括号字符串S,考虑其原始分解:S = P_1 + P_2 + ... + P_k,其中P_i是原始有效括号字符串。

在去除S的原语分解中的每个原始字符串的最外面的括号后返回S。例如:

输入:"(()())(())"
输出:"()()()"
说明:
输入字符串是"(()())(())",带有原语分解"(()())"+"(())"
删除每个部分的外括号后,"()()" + "()" = "()()()"

输入:"(()())(())(()(()))"
输出:"()()()()(())"
说明:
输入字符串是"(()())(())(()(()))",带原语分解"(()())"+"(())"+"(()(( )))"
删除每个部分的外括号后,"()()" + "()" + "()(())" = "()()()()(())"

输入:"()()"
输出:""
说明:
输入字符串是"()()",原始分解"()"+"()"
删除每个部分的外括号后,""+""=""。

注意

  • S.length <= 10000
  • S[i]"("")"
  • S是一个有效的括号字符串。

02 第一种解法

根据题目的描述和例子来看,是要找到S中的每一个原始有效字符串,然后去掉每个原始有效字符串的外层括号。

S中,左括号"("和右括号")"是成对出现的,即在每一个原始有效字符串中,左括号和右括号的数量是相同的。

思路:从左到右遍历S中的字符,定义两个变量leftright,记录遇到的左括号、右括号的数量,当左括号和右括号的数量相等时,说明遇到了一个原始有效字符串,去掉头尾的括号,借助字符串截取完成,拼接到StringBuilder中。

public String removeOuterParentheses(String S) {
    StringBuilder sb = new StringBuilder();
    int left = 0, right = 0, index = 0;
    int n = S.length();
    for (int i=0; i<n; i++) {
        if (S.charAt(i) == '(') {
            left++;
        } else if (S.charAt(i) == ')') {
            right++;
        }
        if (left == right) {
            sb.append(S.substring(index+1, i));
            index = i + 1;
        }
    }
    return sb.toString();
}

03 第二种解法

思路和上面第一种解法类似,只是没有借助两个变量来计数,而是使用一个变量count,遇到左括号就加1,遇到右括号就减1,但是最开始的左括号和最后边的右括号时不能拼接进去的,所以当遇到左括号且count等于1的时候,要进入下一次循环,当遇到右括号且count等于0的时候,表明当前这个原始有效字符串中的括号已经遍历完了,需要进入下一次循环。

public String removeOuterParentheses2(String S) {
    StringBuilder sb = new StringBuilder();
    int count = 0, n = S.length();
    for (int i=0; i<n; i++) {
        if (S.charAt(i) == '(') {
            count++;
            if (count == 1) {
                continue;
            }
        } else if(S.charAt(i) == ')') {
            count--;
            if (count == 0) {
                continue;
            }
        }
        sb.append(S.charAt(i));
    }
    return sb.toString();
}

04 小结

算法专题目前已连续日更超过七个月,算法题文章248+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

原文地址:https://www.cnblogs.com/xiaochuan94/p/11173956.html

时间: 2024-10-29 20:00:22

LeetCode.1021-删除最外面的括号(Remove Outermost Parentheses)的相关文章

LeetCode--To Lower Case &amp; Remove Outermost Parentheses (Easy)

709. To Lower Case(Easy) Implement function ToLowerCase() that has a string parameter str, and returns the same string in lowercase. Example 1: Input: "Hello" Output: "hello" Example 2: Input: "here" Output: "here"

LeetCode #1021. Remove Outermost Parentheses 删除最外层的括号

https://leetcode-cn.com/problems/remove-outermost-parentheses/ Java Solution 1 class Solution { 2 public String removeOuterParentheses(String S) { 3 char[] chars = S.toCharArray(); 4 int flag = 0; 5 StringBuilder result = new StringBuilder(); 6 7 for

LeetCode 1021 Remove Outermost Parentheses

class Solution { public String removeOuterParentheses(String S) { int outer = 0; int inner = 0; char[] intput = S.toCharArray(); char[] output = new char[intput.length]; int i = 0; for (char c: intput) { if (outer != 0) { if (inner == 0) { if (')' ==

[LeetCode][JavaScript]Remove Invalid Parentheses

Remove Invalid Parentheses Remove the minimum number of invalid parentheses in order to make the input string valid. Return all possible results. Note: The input string may contain letters other than the parentheses ( and ). Examples: "()())()"

leetcode Remove Invalid Parentheses

题目连接 https://leetcode.com/problems/remove-invalid-parentheses/ Remove Invalid Parentheses Description Remove the minimum number of invalid parentheses in order to make the input string valid. Return all possible results. Note: The input string may co

前端与算法 leetcode 26. 删除排序数组中的重复项

目录 # 前端与算法 leetcode 26. 删除排序数组中的重复项 题目描述 概要 提示 解析 算法 # 前端与算法 leetcode 26. 删除排序数组中的重复项 题目描述 26. 删除排序数组中的重复项 概要 一提到原地删除数组,就能立即想到双指针法,这道题本身也没什么难度,日常水题, 提示 双指针 解析 没有思路的时候,耐心一点即可 算法 /** ?*[email protected]?{number[]}?nums ?*[email protected]?{number} ?*/

图解精选 TOP 面试题 001 | LeetCode 237. 删除链表中的节点

题目描述 原题链接 LeetCode 237. 删除链表中的节点:https://leetcode-cn.com/problems/delete-node-in-a-linked-list 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 head =?[4,5,1,9],它可以表示为: 示例 1: 输入: head = [4,5,1,9], node = 5 输出: [4,1,9] 解释: 给定你链表中值为 ?5? 的第二个节点,那么在调

[LeetCode] Remove Invalid Parentheses 移除非法括号

Remove the minimum number of invalid parentheses in order to make the input string valid. Return all possible results. Note: The input string may contain letters other than the parentheses ( and ). Examples: "()())()" -> ["()()()",

[LeetCode] 301. Remove Invalid Parentheses 移除非法括号

Remove the minimum number of invalid parentheses in order to make the input string valid. Return all possible results. Note: The input string may contain letters other than the parentheses ( and ). Examples:"()())()" -> ["()()()", &