LeetCode 1021. Remove Outermost Parentheses

[Easy] LeetCode 1021. Remove Outermost Parentheses

链接: https://leetcode.com/problems/remove-outermost-parentheses/

题目描述:
A valid parentheses string is either empty (""), “(” + A + “)”, or A + B, where A and B are valid parentheses strings, and + represents string concatenation. For example, “”, “()”, “(())()”, and “(()(()))” are all valid parentheses strings.
A valid parentheses string S is primitive if it is nonempty, and there does not exist a way to split it into S = A+B, with A and B nonempty valid parentheses strings.
Given a valid parentheses string S, consider its primitive decomposition: S = P_1 + P_2 + … + P_k, where P_i are primitive valid parentheses strings.
Return S after removing the outermost parentheses of every primitive string in the primitive decomposition of S.

有效括号字符串为空 ("")、"(" + A + “)” 或 A + B,其中 A 和 B 都是有效的括号字符串,+ 代表字符串的连接。例如,"","()","(())()" 和 “(()(()))” 都是有效的括号字符串。
如果有效字符串 S 非空,且不存在将其拆分为 S = A+B 的方法,我们称其为原语(primitive),其中 A 和 B 都是非空有效括号字符串。
给出一个非空有效字符串 S,考虑将其进行原语化分解,使得:S = P_1 + P_2 + … + P_k,其中 P_i 是有效括号字符串原语。
对 S 进行原语化分解,删除分解中每个原语字符串的最外层括号,返回 S 。

Example 1:

Input: “(()())(())”
Output: “()()()”
Explanation:
The input string is “(()())(())”, with primitive decomposition “(()())” + “(())”.
After removing outer parentheses of each part, this is “()()” + “()” = “()()()”.

Example 2:

Input: “(()())(())(()(()))”
Output: “()()()()(())”
Explanation:
The input string is “(()())(())(()(()))”, with primitive decomposition “(()())” + “(())” + “(()(()))”.
After removing outer parentheses of each part, this is “()()” + “()” + “()(())” = “()()()()(())”.

Example 3:

Input: “()()”
Output: “”
Explanation:
The input string is “()()”, with primitive decomposition “()” + “()”.
After removing outer parentheses of each part, this is “” + “” = “”.

Note:

  • S.length <= 10000
  • S[i] is “(” or “)”
  • S is a valid parentheses string

Tag: String
解题思路
这道题目的描述很复杂,实际上蛮简单的,就是将所有符合有效的括号字符串最外面的一层括号给删除了。这个字符串需要左右括号数量都一直,而且都可以左右一一对齐,就算是有效的括号字符串。我们实际上只需要两个变量,一个是记录这个括号字符串最左边的一个,另外一个就是记录字符串会在哪里结束。首先明确一点,这个输入本身就是一个有效的括号字符串,也就是说所有左括号都有一个右括号与之匹配。我们用一个count计算左右括号数量的差值。当差值为0时说明我们匹配上了一个括号字符串。我们就可以将这个括号字符串的中间部分记录下来。然后让leftPos指向下一个括号字符串的第一位。再做同样的事情。

TIME; O(N)
SPACE: O(1)

解法一:

class Solution {
    public String removeOuterParentheses(String S) {
        String res = "";
        int count = 0, leftPos =0;
        for(int i=0; i< S.length(); i++){
            char c = S.charAt(i);
            if(c == ')') count--;
            else count++;
            
            if(count == 0){
                res+= S.substring(leftPos+1, i);
                leftPos = i+1;
            }
        }
        
        return res;
    }
}

解法二:
一个更加简短的代码

class Solution {
    public String removeOuterParentheses(String s) {
        StringBuilder sb = new StringBuilder();
        int count = 0;
        for(char c : s.toCharArray()) {
            if(c == '(' && count++ > 0) sb.append(c);
            else if(c == ')' && count-- > 1) sb.append(c);
        }
        return sb.toString();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值