zoukankan      html  css  js  c++  java
  • 1021. Remove Outermost Parentheses

    package LeetCode_1021
    
    import java.util.*
    
    /**
     * 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.
    
    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 "" + "" = "".
     * */
    class Solution {
        /*
        * solution: Stack, heep to keep tracking ( or ) if outermost,
        * Time complexity:O(n), Space complexity:O(n)
        * */
        fun removeOuterParentheses(S: String): String {
            if (S == "") {
                return ""
            }
            val stack = Stack<Char>()
            val sb = StringBuilder()
            for (c in S) {
                if (c == '(') {
                    //if stack not empty and current is (, this one is not outermost, add into result
                    if (stack.isNotEmpty()) {
                        sb.append(c)
                    }
                    stack.push(c)
                } else {
                    stack.pop()
                    if (stack.isNotEmpty()){
                        sb.append(c)
                    }
                }
            }
            return sb.toString()
        }
    }
  • 相关阅读:
    [Codeforces Round #617 (Div. 3)] 题解 A,B,C,D,E1,E2,F
    [Codeforces Round #611 (Div. 3)] C. Friends and Gifts (随机大法好)
    [Hello 2020] D. New Year and Conference (ST表,排序)
    [Hello 2020] C. New Year and Permutation (组合数学)
    Codeforces Beta Round #7 C. Line (扩展欧几里德)
    扩展欧几里德
    Codeforces Round #349 (Div. 2) D. World Tour (最短路)
    HDU 4052 Adding New Machine (线段树+离散化)
    HDU 3265 Posters (线段树+扫描线)(面积并)
    HDU 1828 Picture (线段树+扫描线)(周长并)
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/13803348.html
Copyright © 2011-2022 走看看