• 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()
        }
    }
  • 相关阅读:
    C# 接口
    C# 多态
    C# 继承
    C# 封装
    动态规划:从新手到专家
    hduoj题目分类
    4.2 最邻近规则分类(K-Nearest Neighbor)KNN算法应用
    警惕自增的陷阱(++)
    五大常用算法之四:回溯法
    算法java实现--回溯法--图的m着色问题
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/13803348.html
Copyright © 2020-2023  润新知